动态创建对象执行方法

动态创建对象执行方法

  • 有了Class对象,能做什么?

    创建类的对象:调用Class对象的newInstance()方法
    a) 类必须有一个无参数的构造器
    b)类的构造器访问权限需要足够

  • 思考 难道没有无参的构造器就不能创建对象了吗?只要在操作的时候明确的调用类中的构造器,并将参数传递出去之后,才可以实例化操作。

    步骤如下:

    1. 通过class类的getDeClaredConstructor(Class …parameterTypes)获得本类的指定形参类型的构造器
      2)向构造器的形参中传递一个对象数组进去,里面包含了构造器所需要的各个参数
      3)通过Constructor使用newInstance()方法实例化对象
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语言的访问检查。
posted @ 2021-04-28 10:18  saxon宋  阅读(72)  评论(0)    收藏  举报