反射的使用方式与调用构造函数

  • 在运行时动态地获取和使用类的信息的机制,在Java中可以使用反射API来获取类的构造函数并进行调用

  • 对一个类、对象进行提供一个反射的机制

    • 判断任意一个对象的属性

    • 构造任意一个类的对象

    • 判断任意一个类的所有成员变量和方法

    • 任意的调用一个对象中的成员和方法

    • 生成动态的代理(*)

  • Constructor 构造函数

  • Method 类的方法

  • Field 成员变量

  • Class 一个类

  • 获取类对象: 首先需要获取要使用的类的Class对象,有以下几种方式来获取类对象:

    • 使用Class.forName("类名")方法:通过类的全限定名获取类对象。

    • 使用类名.class:直接通过类字面常量获取类对象。

    • 使用对象.getClass():通过已经存在的对象获取类对象。

public static void main(Stirng[] args){
    //方式一
    Person person = new Person();
    Class<? extends Person> aClass = person.getClass(); 
    
    //方式二
    Class<Person> personClass = Person.class;
    
    //方式三
    Class<?> aClass1 = Class.forName("com......Person");
    
    System.out,println("aClass==personClass = " + (aClass == personClass));
     System.out,println("personClass == aClass = " + (personClass == aClass));
     System.out,println("aClass==aClass1 = " + (aClass == aClass1));
    
    //结果都为true
}
  • 通过反射方式调用构造函数以及获取构造函数中的参数列表

  • 获取构造函数对象: 通过类对象获取要调用的构造函数对象,可以使用以下方法:

    • getConstructor(Class<?>... parameterTypes):根据参数类型获取公共的构造函数。

    • getDeclaredConstructor(Class<?>... parameterTypes):根据参数类型获取任意访问权限的构造函数,包括私有的构造函数。

public static void main(String[] args) throws Exception{
    HelloWorld hello = new HelloWorld();
    hello.getVoid01();
}
​
public void getVoid01(){
    Class personClass = Person.class;
    //调用对应的构造函数
    Constructor constructor = personClass.getConstructor(String.class,String.class);
    Person p = (Person)constructor.newInstance("老哥","兄弟");
    System.out.println("p = " + p);
}
​
//获取构造函数中的参数列表
public void getVOid02(){
    //获取构造函数中的参数列表
    Class personClass = Person.class;
    //调用对应的构造函数
    Constructor[] constructors = personClass.getCOnstructors();
    Constructor[] declareConstructors = personClass.getDeclaredConstructors();
    for(Constructor declareConstructor : deClareConstructors){
        System.out.println(deClareConstructor.getName());
        System.out.print("(");
        //获取对应的类型
        Class[] parameterTypes = declaredConstructor.getParameterTypes();
        for(Class parameterType : parameterTypes){
           System.out.print(parameterType.getName() + " ");
        }
        System,out.print(")");
        System,out.println("");
    }
}

反射获取属性和方法

  • 创建实例: 通过构造函数对象调用newInstance(Object... initargs)方法来创建类的实例,传入相应的构造函数参数。如果构造函数没有参数,可以直接调用newInstance()方法。

  • 获取构造函数

public void getVoid03(){
    Class<Person> personClass = Person.class;
    //获取公开的
    Constructor<?>[] constructors = personClass.getConstructors();
    //获取所有的,包括私有
    Construtor<?> declareConstructors = personClass.getDeclaredConstructors();
    for(Constructor<?> constructor : declareConstructors){
     System.out.print(construcotr.getName() + "( ");
        Class<?>[] parametterTypes = constructor.getParameterTypes();
        for(Class<?> parameterType : parameterTypes){
            System.out.println(parameterType.getName() + " ");
            System.out.print(") ");
            System.out.println(" ");
        }
}
  • 获取对应的方法

public void getVoid03() throws Exception{
    Class<Person> personClass = Person.class;
    //获取公开的
    Method[] methods = personClass.getMethods();
    //获取私有的
    Method[] declaredMethods = personClass.getDeclaredMethods();
    
    for(Method method : methods){
        System.out.println(method.getName());
        if(method.getName().contains("setLastName")){
            Constructor<Person> construcotr = personClass.getConstructor(null);
            Person toms = constructor.newInstance(null);
            method.invoke(toms,"toms");
        }
    }
    
    for(Method method : declaredMethods){
        //如要代用私有的方法需要开启,
        method.setAccessible(true);
    }
}
  • 获取属性

public void getVoid06(){
    Class<Person> personClass = Person.class;
    //获取公开的
    Field[] fields = personClass.getFields();
    for(Field field : fields){
        System.out.println("field = " + field);
    }
    //获取私有的
    Field[] declareFields = personClass.getDeclareFields();
    for(Field declareField : declareFields){
        System.out.println("declareField = " + declareField);
    }
}
  • eg:

public void getVoid07(){
    ArrayList<String> strings = new ArrayList<>();
    strings.add("小王");
    Class<? extends ArrayList> aClass = strings.getClass();
    Method add = aClass.getMethod("add",Object.class);
    add.invoke(strings,123456);
    System.out.println("strings = " + strings);
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鱼粮爱编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值