Java反射用法

反射,一种计算机处理方式。是程序可以访问、检测和修改它本身状态或行为的一种能力。

package com.demo.reflectTest;

import java.lang.reflect.Array;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.Arrays;
import com.mysql.jdbc.Driver;

public class Test {

	public static void main(String[] args) {

		try {
			Driver driver = new Driver();
			// 用法一:通过一个对象获得完整的包名和类名
			System.out.println(driver.getClass());
			// 用法二:实例化Class类的对象
			Class<?> class1 = Class.forName("com.mysql.jdbc.Driver");
			Class<?> class2 = new Driver().getClass();
			Class<?> class3 = Driver.class;
			System.out.println(class1.getName());
			System.out.println(class2.getName());
			System.out.println(class3.getName());
			// 用法三:通过Class实例化其他无参构造类的对象
			Class<?> user = Class.forName("com.demo.reflectTest.User");
			User u = null;
			u = (User) user.newInstance();
			System.out.println(user.equals(u));
			// 用法四:通过Class调用其他类中的构造函数 (也可以通过这种方式通过Class创建其他类的对象)
			Constructor<?> cons[] = user.getConstructors();
			System.out.println(cons[0].getModifiers() + " "
					+ cons[0].toGenericString());
			User u0 = (User) cons[0].newInstance("root", "123456", 20);
			System.out.println(cons[1].getModifiers() + " "
					+ cons[1].toGenericString());
			User u1 = (User) cons[1].newInstance("admin", 23);
			System.out.println(cons[2].getModifiers() + " "
					+ cons[2].toGenericString());
			User u2 = (User) cons[2].newInstance("temp");
			// 用法五:返回一个类实现的接口
			Class<?> ins[] = user.getInterfaces();
			for (Class<?> c : ins) {
				System.out.println(c.getName());
			}
			// 用法六:取得其他类中的父类
			System.out.println(user.getSuperclass());
			// 用法七:获得类的属性
			Field[] field = user.getDeclaredFields();
			for (Field f : field) {
				System.out.print(Modifier.toString(f.getModifiers()) + " ");
				System.out.print(f.getType() + " ");
				System.out.print(f.getName() + " ");
				System.out.println();
			}
			// 用法八:通过反射调用其他类中的方法(JDK动态代理)
			Method method = user.getMethod("sayHello");
			method.invoke(user.newInstance());
			method = user.getMethod("sayWords", String.class);
			method.invoke(user.newInstance(), "World");
			// 用法九:调用其他类的set和get方法
			u = (User) user.newInstance();
			setter(u, "Password", "654321", String.class);
			getter(u, "Password");
			// 用法十:通过反射操作属性
			u = (User) user.newInstance();
			Field fd = user.getDeclaredField("username");
			fd.setAccessible(true);
			fd.set(u, "guest");
			System.out.println(fd.get(u));
			// 用法十一:通过反射取得并修改数组的信息
			int[] a = { 5, 4, 3, 2, 1, 0 };
			Class<?> array = a.getClass().getComponentType();
			System.out.println(array.getName());
			System.out.println(Array.getLength(a));
			System.out.println(Array.get(a, 2));
			Array.set(a, 0, 7);
			System.out.println(Array.get(a, 0));
			// 用法十二:通过反射修改数组大小
			int b[] = { 1, 2, 3, 4 };
			int newB[] = (int[]) arrayInc(b, 8);
			System.out.println(Arrays.toString(newB));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	private static Object arrayInc(Object o, int length) {
		// TODO 自动生成的方法存根
		Class<?> arr = o.getClass().getComponentType();
		Object newO = Array.newInstance(arr, length);
		int oldLength = Array.getLength(o);
		System.arraycopy(o, 0, newO, 0, oldLength);
		return newO;
	}

	private static void getter(Object o, String att) {
		// TODO 自动生成的方法存根
		try {
			Method method = o.getClass().getMethod("get" + att);
			System.out.println(method.invoke(o));
		} catch (Exception e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
	}

	private static void setter(Object o, String att, Object value, Class<?> type) {
		// TODO 自动生成的方法存根
		Method method;
		try {
			method = o.getClass().getMethod("set" + att, type);
			method.invoke(o, value);
		} catch (Exception e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
	}
}

猜你喜欢

转载自xiongjiajia.iteye.com/blog/2332166