java反射技术

一.反射获取对象

1.获取字节码文件的三种方式

Class.forName("类的全路径")
对象.getClass()
类名.class

2.获取构造方法的api

		Class clazz=Student.class;
		Constructor c = clazz.getDeclaredConstructor(boolean.class);//获取某个指定的构造方法(包括私有构造)
		Constructor[] constructors = clazz.getDeclaredConstructors();//获取所有的构造方法(包括私有构造)
		Constructor[] constructors2 = clazz.getConstructors();//获取所有的构造方法(不包括私有构造)
		Constructor constructor = clazz.getConstructor(null);//获取某个指定的构造方法(不包括私有构造)
<span style="white-space:pre">		</span>//如果是无参构造的话,参数可以给null,或者不给<span style="font-family: Arial, Helvetica, sans-serif;">			</span>
		Constructor c = clazz.getDeclaredConstructor();
		Constructor constructor = clazz.getConstructor();

3.构造方法调用newInstance(Object....obj),来获取到对象实例

		c.setAccessible(true);//若果获取到的是private的构造,需要暴力反射设置为true
		c.newInstance(true)<span style="font-family: Arial, Helvetica, sans-serif;">;//clazz..newInstance()默认调用的是类中的无参构造来获取实例对象的</span>


二.反射获取方法

public class Demo2Method {
	/*
	 * 与操作方法相关的方法:
	 *  Method getMethod(String name, Class<?>... parameterTypes)  第一个参数:方法,第二个参数:参数类型或个数。
	 *  	得到指定的公共方法。
 		Method[] getMethods() 返回一个包含某些 Method 对象的数组,得到所有公共方法(包括父类或父接口的公共方法)。 

		 Method getDeclaredMethod(String name, Class<?>... parameterTypes) 
          	得到指定的方法。
 		Method[] getDeclaredMethods() 
          		返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。 
Method对象的方法:
	Object invoke(Object obj, Object... args) //此方法代表要执行的方法。第一个参数:表示要执行哪个对象中的方法,第二个参数:代表实参。
          对带有指定参数的指定对象调用由此 Method 对象表示的底层方法。 
	 * */
	
	@Test //public void m1()
	public void test1() throws Exception{
		//Student stu = new Student();
		Class clazz = Student.class;
		Method m = clazz.getMethod("m1");
		m.invoke(clazz.newInstance(), null);  //此方法代表要执行m方法。第一个参数:表示要执行哪个对象中的方法,第二个参数:代表实参。
	}
	
	@Test //public void m2(String name)
	public void test2() throws Exception{
		Class clazz = Student.class;
		Method m = clazz.getMethod("m2",String.class);
		m.invoke(clazz.newInstance(), "tom");  //此方法代表要执行m方法。第一个参数:表示要执行哪个对象中的方法,第二个参数:代表实参。
	}
	
	@Test //public String m3(String name){
	public void test3() throws Exception{
		Class clazz = Student.class;
		Method m = clazz.getMethod("m3",String.class);
		Object o = m.invoke(clazz.newInstance(), "tom");  //invoke方法的返回值,就是执行的方法的返回值。如何是void的方法,则返回null。
		
		System.out.println(o);
	}
	
	@Test //private void m4(int age)
	public void test4() throws Exception{
		Class clazz = Student.class;
		Method m = clazz.getDeclaredMethod("m4",int.class);
		m.setAccessible(true);
		m.invoke(clazz.newInstance(), 18);  //invoke方法的返回值,就是执行的方法的返回值。如何是void的方法,则返回null。
	}
	
	@Test //public static void m5(String name,int age)
	public void test5() throws Exception{
		Class clazz = Student.class;
		Method m = clazz.getMethod("m5",String.class,int.class);
		m.invoke(null, "tom",18);  //invoke方法的返回值,就是执行的方法的返回值。如何是void的方法,则返回null。
	}
	
	@Test //public static void m6(String[] args){
	public void test6() throws Exception{
		Class clazz = Student.class;
		Method m = clazz.getMethod("m6",String[].class);
		//m.invoke(null,new Object[]{new String[]{"tom","jerry","aaa"}});  //invoke方法的返回值,就是执行的方法的返回值。如何是void的方法,则返回null。
		m.invoke(null,(Object)new String[]{"tom","jerry","aaa"});
	}
	
	@Test //提到所有方法
	public void test7() throws Exception{
		Class clazz = Student.class;
		Method[] ms = clazz.getMethods();//得到所有公共的方法
		System.out.println(ms.length);
	}
	
	@Test //提到所有方法
	public void test8() throws Exception{
		Class clazz = Student.class;
		Method[] ms = clazz.getDeclaredMethods();//得到当前类所有方法
		System.out.println(ms.length);
	}
}


三.反射获取字段(成员变量)

public class Demo3Field {
	/*
	 *  Field getField(String name) 
          		返回一个 Field 对象,它反映此 Class 对象所表示的类或接口的指定公共成员字段。 
 		Field[] getFields() 
          		返回一个包含某些 Field 对象的数组,这些对象反映此 Class 对象所表示的类或接口的所有可访问公共字段。 

		Field getDeclaredField(String name) 
          		返回一个 Field 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明字段。 
 		Field[] getDeclaredFields() 
          	返回 Field 对象的一个数组,这些对象反映此 Class 对象所表示的类或接口所声明的所有字段。 
 Field对象的方法:
 
 	Object get(Object obj)  返回指定对象上此 Field 表示的字段的值。 
 	void set(Object obj, Object value) 给第一个参数所表示的对象,赋值(第二个参数) 
	 * */
	@Test   //给操作公共变量name
	public void test1() throws Exception{
		Student stu = new Student();
		Class clazz = Student.class;
		Field f = clazz.getField("name");
		System.out.println(f.get(stu));
		
		f.set(stu, "李四");
		
		Field f1 = clazz.getField("name");
		System.out.println(f1.get(stu));
	}
	
	@Test   //给操作私有变量age
	public void test2() throws Exception{
		Student stu = new Student();
		Class clazz = Student.class;
		Field f = clazz.getDeclaredField("age");
		f.setAccessible(true);
		f.set(stu,18);
		
		/*Field f1 = clazz.getDeclaredField("age");
		f1.setAccessible(true);*/
		System.out.println(f.get(stu));
	}
	
	@Test   //给操作私有变量age
	public void test3() throws Exception{
		Student stu = new Student();
		Class clazz = Student.class;
		//Field f = clazz.getDeclaredField("name");
		Field[] fs = clazz.getDeclaredFields();
		for (Field f : fs) {
			System.out.println(Modifier.toString(f.getModifiers())+"\t"+f.getType().getSimpleName()+"\t"+  f.getName());
		}
	}
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值