动态创建对象执行方法
动态创建对象执行方法
-
有了Class对象,能做什么?
创建类的对象:调用Class对象的newInstance()方法
a) 类必须有一个无参数的构造器
b)类的构造器访问权限需要足够 -
思考 难道没有无参的构造器就不能创建对象了吗?只要在操作的时候明确的调用类中的构造器,并将参数传递出去之后,才可以实例化操作。
步骤如下:
- 通过class类的getDeClaredConstructor(Class …parameterTypes)获得本类的指定形参类型的构造器
2)向构造器的形参中传递一个对象数组进去,里面包含了构造器所需要的各个参数
3)通过Constructor使用newInstance()方法实例化对象
- 通过class类的getDeClaredConstructor(Class …parameterTypes)获得本类的指定形参类型的构造器
public static void main(String[] args) throws Exception {
Class c1 = Class.forName("com.saxon.reflection.Person");
/*//构造一个对象
Person person = (Person) c1.newInstance(); //本质调用了类的无参构造器
System.out.println(person);*/
/* //通过构造器构造对象
Constructor declaredConstructor = c1.getDeclaredConstructor(String.class);
Person person = (Person) declaredConstructor.newInstance("Mary");
System.out.println(person);*/
/* //通过反射的普通方法调用
Person person = (Person) c1.newInstance();
//通过反射获取一个方法
Method setName = c1.getDeclaredMethod("setName", String.class);
setName.invoke(person,"Lliy");
System.out.println(person.getName());*/
//通过反射操作属性
Person person= (Person) c1.newInstance();
Field name = c1.getDeclaredField("name");
name.setAccessible(true);//由于无法对私有属性进行访问,需要把setAccessible改正为true
name.set(person,"Simon");
System.out.println(person.getName());
}
-
反射调用指定的通过反射,调用类中的方法,通过Method类完成
1,通过Class类的getMethod(String name,Class…parameterTypes)方法取得一个Method对象,并设置此方法操作时所需要的参数类型。
2,之后使用Object invoke(Object obj,Object[] args)进行调用,并向 方法中转递要设置的obj对象的参数信息方法
Object invoke(Object obj,Object[] args):
- Object对应原方法的返回值,若原方法没有返回值,则此时返回null
- 若原方法为静态方法,则形参Object obj可为null
- 若原形参列表为空,则Object[] args为null
- 若原方法为private,需要采用invoke()时之前,需要加上setAccessable(true)
setAccessible:
- Method和field,Constructor对象都有setAccessible()方法。
- setAccessible作用是启动和禁用访问安全检查的开关。
参数值为true则指示反射的对象在使用时应该取消java语言的访问检查。
提高反射效率,如果代码中必须要用反射,而该语句代码需要频繁的被调用,那么请设置为true。
-使得原来无法访问的私有成员也可以访问
参数值为false则指示反色和的对象在使用时应该实施java语言的访问检查。

浙公网安备 33010602011771号