java反射

what

JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。


class类

万物皆对象,类是Class类的对象

获取class类

 //方式1 通过Object类的getClass方法
Person p = new Person();
Class c1 = p.getClass();

Person p2 = new Person();
Class c2 = p2.getClass();

System.out.println(p == p2);
System.out.println(c1 == c2);//true 一个类的字节码对象只有一个
		
//方式2 任意对象的静态的class属性
Class c3 = Person.class;
		
//方式3 通过Class类的静态方法forName()
Class c4 = Class.forName("com.reflect.Person");
System.out.println(c1==c4);

获取类信息

//获取字节码文件对象
Class c = Class.forName("com.reflect.Person");

//获取无参构造器
Constructor con = c.getConstructor();
		
//通过构造器对象创建对象
Object obj = con.newInstance();

 //获取有参构造器
//传递参数的字节码对象
Constructor con = c.getConstructor(String.class,int.class);
//3.创建对象
Object obj = con.newInstance("xyg",15);
//-----------------------------------------------------------------------------
//获取单个公开成员
Field ageField = c.getField("age");
	
 //获取单个私有成员
Field nameField = c.getDeclaredField("name");
nameField.setAccessible(true);//设置为true才能访问

//通过Field对象设置成员值
Constructor con = c.getConstructor();
Object obj = con.newInstance();
ageField.set(obj, 12);//给obj对象的field字段赋值12
nameField.set(obj, "xyg");
 //-----------------------------------------------------------------------------
 //获取class
Class c = Class.forName("com.reflect.Person");
//拿到对象
Constructor con = c.getConstructor();
Object obj = con.newInstance();

//获取单个无参方法
Method m1 = c.getMethod("show", null);
 //无参传递null
m1.invoke(obj, null);

//获取单个有参方法
Method m2 = c.getMethod("function", String.class);
m2.invoke(obj, "xyg");

 //获取多参有返回值
Method m3 = c.getMethod("returnValue", String.class,int.class);
System.out.println(m3.invoke(obj, "林青霞",38));
                
 //获取私有方法
Method m4 = c.getDeclaredMethod("hello",null);
m4.setAccessible(true);
m4.invoke(obj, null);

通过反射越过泛型检查

ArrayList<Integer> list = new ArrayList<>();
list.add(24);
list.add(432);
//		list.add("fdjsl");ERROR
Class c = list.getClass();
Method m = c.getDeclaredMethod("add", Object.class);//这里要接受Object的字节码
m.invoke(list, "hello");
m.invoke(list, "world");
System.out.println(list);
posted @ 2019-03-05 19:55  熊云港  阅读(143)  评论(0)    收藏  举报