Reflection

TestPo

public class TestPo {
	private String username;
	public String sex;
	public static String email;
	private static String phone;
	public TestPo() {
		super();
	}
	public TestPo(String username, String sex) {
		super();
		this.username = username;
		this.sex = sex;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public static String getEmail() {
		return email;
	}
	public static void setEmail(String email) {
		TestPo.email = email;
	}
	public static String getPhone() {
		return phone;
	}
	public static void setPhone(String phone) {
		TestPo.phone = phone;
	}
	
	public void test1(){
		System.out.println("test1()");
	}
	
	public static void test2(){
		System.out.println("test2()");
	}
	
	public void add(int a, int b){
		System.out.println(a+b);
	}
}



  反射的三种方法

public class TestReflection {
	public static void main(String[] args) {

		// 第一种反射
		Class clazz = TestPo.class;

		// 第二种反射方式
		TestPo testPo = new TestPo();
		Class clazz = testPo.getClass();

		// 第三种反射
		try {
			Class clazz = Class.forName("Reflection.TestPo"); // 要填写完整的包名
			System.out.println(clazz.getName()); // 包名加类名
			System.out.println(clazz.getSimpleName()); // 只是类名
			System.out.println(clazz.getPackage()); // 完整的包名
			// 还有很多方法,可以去查API
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
}

  Field(属性)

public static void testField() {
	Class clazz = TestPo.class;
	Field[] fields = clazz.getFields();
	for (int i = 0; i < fields.length; i++) {
		System.out.println(fields[i].getName()); // 只出现公共的属性
	}
	System.out.println("-------");
	Field[] fieldsAll = clazz.getDeclaredFields();
	for (int i = 0; i < fieldsAll.length; i++) {
		System.out.println(fieldsAll[i].getName()); // 出现全部的属性
	}

	try {
		Object obj = clazz.newInstance(); // new一个新实例 注意的是通过无参构造方法new出来的

		// 普通属性修改
		Field fdS = clazz.getField("sex"); // sex属性的访问权限是public的
		fdS.set(obj, "nan");
		System.out.println(((TestPo) obj).getSex());

		// 非公共字段(非官方说法,至今发现getField只能取到public,此问题待定)
		Field fdU = clazz.getDeclaredField("username"); // 注意不要写成getField("username")
		fdU.setAccessible(true);
		// 将此对象的 accessible 标志设置为指示的布尔值。
		// 值为 true 则指示反射的对象在使用时应该取消 Java 语言访问检查。
		fdU.set(obj, "xiaowang");
		System.out.println(((TestPo) obj).getUsername());
		System.out.println("--------");

		// 静态属性可以不传对象
		Field fdE = clazz.getField("email");
		fdE.set(null, "aa@aa.com");
		System.out.println(((TestPo) obj).getEmail());
		System.out.println(((TestPo) obj).getUsername()); // 通过clazz它们连接在一起
	} catch (Exception e) {
		e.printStackTrace();
	}
}

  Method(方法)

public static void testMethod() {
	try {
		Class clazz = Class.forName("Reflection.TestPo");
		Method[] methods = clazz.getDeclaredMethods(); // 和属性一样getMethods不能取出全部
		// for (int i = 0; i < methods.length; i++) {
		// System.out.println(methods[i].getName());
		// }

		try {
			Method method1 = clazz.getMethod("test1", null);
			Object obj = clazz.newInstance();
			method1.invoke(obj, null);

			// 静态方法可以省略对象
			Method method2 = clazz.getMethod("test2", null);
			method2.invoke(null, null);

			// 关于getMethod和invoke后面参数的问题
			Method method3 = clazz.getMethod("add", new Class[] {
					int.class, int.class });
			// 传int.class是因为Class数组中只能传Class类型
			method3.invoke(obj, new Object[] { 123, 123 });
		} catch (Exception e) {
			e.printStackTrace();
		}
	} catch (Exception e) {
		e.printStackTrace();
	}
}

  Constructor(构造方法)

public static void testConstructor() {
	Class clazz = TestPo.class;
	try {
		Constructor constructor = clazz.getConstructor(new Class[] {
				String.class, String.class });
		TestPo tp = (TestPo) constructor.newInstance(new Object[] { "aaa",
				"bbb" });
		System.out.println(tp.getSex() + "------" + tp.getUsername());
	} catch (SecurityException e) {
		e.printStackTrace();
	} catch (NoSuchMethodException e) {
		e.printStackTrace();
	} catch (IllegalArgumentException e) {
		e.printStackTrace();
	} catch (InstantiationException e) {
		e.printStackTrace();
	} catch (IllegalAccessException e) {
		e.printStackTrace();
	} catch (InvocationTargetException e) {
		e.printStackTrace();
	}
}

  IsInstance(对象匹配)
public static void testIsinstance() {
	Class clazz = TestPo.class;
	TestPo testPo = new TestPo();
	TestReflection testReflection = new TestReflection();
	System.out.println(clazz.isInstance(testPo));
	// 判定指定的 Object 是否与此 Class 所表示的对象赋值兼容。
	System.out.println(clazz.isInstance(testReflection));
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值