Java反射机制实在运行状态时,对于任意一个类,都能够知道这个类的属性和方法,对于任意一个对象,都能够调用他的任意一个属性和方法
获取Class对象的三种方式
Object类中的getClass()方法
想要用这种方式,必须要明确具体的类,并创建对象1
2Person p = new Person();
Class clazz = p.getClass();任何数据类型都具备一个静态的属性.class来获取其对应的Class对象
相对简单,但是还是要明确用到类中的静态成员1
Class clazz = Person.class;
通过给定的类的字符串名称就获取该类,该方法就是forName
1
2String className = "com.abc.Person"; //此处为class的全称
Class clazz = Class.forName(className);
获取构造函数
无参构造函数
1
2
3String name = "com.abc.Person";
Class clazz = Class.forName(name);
Object obj = clazz.newInstance();有参构造函数
获取到该构造函数:getConstructor(paramterTypes);
1
2
3
4String name = "com.abc.Person";
Class clazz = Class.forName(name);
Constructor constructor = clazz.getConstructor(String.class, int.class);
Object obj = constructor.newInstance("test", 10);
获取字段
公有1
2
3
4Class clazz = Class.forName("com.abc.Person");
Field field = clazz.getField("age"); //只能获取公有的
Object o = field.get(obj);
System.out.println(o);
私有1
2
3
4
5
6
7
8Class clazz = Class.forName("com.abc.Person");
Field field = clazz.getDeclaredField("age"); //只获取本类,但包含私有
//对私有字段的访问取消权限检查,暴力访问
field.setAccessible(true);
Object obj = clazz.newInstance();
field.set(obj, 20);
Object o = field.get(obj);
System.out.println(o);
获取方法
获取所有方法
1
2
3
4
5
6Class clazz = Class.forName("com.abc.Person");
Method[] methods = clazz.getMethods(); //获取的都是公有的方法。
//methods = clazz.getDeclaredMethods(); //只获取本类中所有方法,包含私有
for(Method method : methods){
System.out.println(method);
}调用无参方法
1
2
3
4
5
6Class clazz = Class.forName("com.abc.Person");
Method method = clazz.getMethod("show", null); //获取空参数一般方法。
//Object obj = clazz.newInstance();
Constructor constructor = clazz.getConstructor(String.class, int.class);
Object obj = constructor.newInstance("name", 10);
method.invoke(obj, null);调用有参方法
1
2
3
4Class clazz = Class.forName("com.abc.Person");
Method method = clazz.getMethod("show", String.class, int.class);
Object obj = clazz.newInstance();
method.invoke(obj, "name", 20);