java之反射

Java反射机制的原理与应用

Java的反射机制是指在程序运行时能够动态地获取类、方法、字段等信息,甚至可以在运行时创建对象、调用方法和访问属性。反射使得程序在编译时不需要了解具体的类信息,而可以在运行时进行操作,提供了更大的灵活性和动态性。比如:通过配置 properties 文件结合反射机制,可以实现动态修改配置而无需改变源代码。这样的设计模式在实际开发中非常常见,比如用来配置数据库连接信息、应用程序的运行参数等。反射机制可以通过读取配置文件,动态加载类、设置属性或调用方法,从而实现灵活的配置和行为控制。

如何获取Class对象?

  • 第一种获取类的方式:通过Class.forName("类的全限定名")来获取类的Class对象,注意需要正确提供完整的类名,否则会抛出ClassNotFoundException。最常用的一种。
  • 第二种方式是通过对象的getClass()方法来获取该对象的Class实例。当我们已经有了该类的对象再使用。
  • 第三种方式是通过基本数据类型或引用类型直接使用.class属性来获取类的信息。一般更多的当做参数进行传递。

如何通过反射机制获取类的Class对象,并验证获取到的Class对象是否相等? 

public class ReflectTest01 {
    public static void main(String[] args) throws ClassNotFoundException {
       
         // stringClass 代表着 String 类型。
        // stringClass 就代表硬盘上的 String.class 文件。
        Class stringClass = Class.forName("java.lang.String");

        String s1 = "动力节点";
        Class stringClass2 = s1.getClass();

        // 某种类型的字节码文件在内存当中只有一份。
        // stringClass 和 stringClass2 都代表了一种类型:String 类型
        System.out.println(stringClass == stringClass2); // true

         // 获取 User 类型
        Class userClass = Class.forName("com.powernode.javase.reflect.User");//类的全限定名

        User user = new User("zhangsan", 20);
        Class userClass2 = user.getClass();
        System.out.println(userClass2 == userClass); // true

        // intClass 代表的就是基本数据类型 int 类型
        Class intClass = int.class;
        Class doubleClass = double.class;
    }
}

利用反射获取构造方法

package Constructor;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Parameter;

public class demo1 {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
        Class clazz = Class.forName("Constructor.Student");

        //  获取构造方法
        // 获取public的构造方法
        Constructor[] cons = clazz.getConstructors();
        for (Constructor con : cons) {
            System.out.println(con);
        }
        System.out.println("-----------------获取所有参数--------------------");
        // 获取所有参数
        Constructor[] all = clazz.getDeclaredConstructors();
        for (Constructor c : all) {
            System.out.println(c);
        }

        // 获取单个构造方法
        // ()当中的参数要和需要获取的构造函数的参数保持一致
        Constructor con1 = clazz.getDeclaredConstructor();
        System.out.println("默认的构造方法:"+ con1);

        Constructor con2 = clazz.getDeclaredConstructor(String.class);
        System.out.println("获取通过名字创造对象的构造方法:"+con2);
        Constructor con3 = clazz.getDeclaredConstructor(String.class,int.class);
        System.out.println("获取通过名字和年龄创造对象的构造方法:"+con3);

        // 获取构造方法的权限修饰符
        // 返回值是整数 public - 1,private - 2 ,protected - 4
        // 是2的次方
        int modifiers = con2.getModifiers();
        System.out.println(modifiers);

        // 获取con2的构造方法所有的参数
        Parameter[] parameters = con2.getParameters();
        for (Parameter p : parameters) {
            System.out.println(p);
        }

        // 通过构造方法实例化对象
        Student o = (Student) con3.newInstance("zhangsan", 24);
        System.out.println(o);
        // 如果构造方法是私有的,我们还需要临时取消权限的校验
        con2.setAccessible(true);
        Student o1 = (Student)con2.newInstance("wangwu");
        System.out.println(o1);
    }
}

 通过反射机制获取类的成员变量(字段)

import java.lang.reflect.Field;
// 获取对象的成员变量
public class demo2 {
    public stat
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值