Java反射机制简析(记录)

反射机制简析

1.java反射机制功能
①在运行时判断任意一个对象所属的类;
②在运行时构造任意一个类的对象;
③在运行时判断任意一个类所具有的成员变量和方法;
④在运行时调用任意一个对象的方法;
⑤生成动态代理。
2.获取源头Class
所有类的对象其实都是Class的实例。
2.1. 获取Class对象的三种方式
第一种方式: 对象.class

 	// 1、通过对象获取Class对象
    public static void testGetClassByObj(){
        //需要有一个对象
        Person p=new Person();
        Class aClass = p.getClass();
        System.out.println(aClass);
    }

第二种方式: 类.class

	// 2、通过类名获取Class对象
    public static void testGetClassByClass(){
        Class clz= Person.class;
        System.out.println(clz);
    }

第三种方式(推荐方式): Class.forName()

	// 3、通过字符串获取类的Class对象
    public static void testGetClassByString(){
        //完整的包名+类名
        String className="com.shsxt.test.reflect.Person";
        try {
            Class aClass = Class.forName(className);
            System.out.println(aClass);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

2.2. 获取修饰符
使用 getModifiers() 即可, Modifier 类提供了 static 方法和
常量来解码类和成员访问修饰符

		 //获取Person的Class
        Class personClass = Person.class;
        //获取修饰符,以整数编码
        int m1=personClass.getModifiers();
        //打印编码值
        System.out.println(m1);
         //使用Modifier转换为相应的字符串
        System.out.println(Modifier.toString(m1));
         //获取Class的类型
        System.out.println(personClass.getSimpleName());

3. 创建对象
3.1根据Class对象,我们可以获得构造器,为实例化对象做准备。
主要通过以下类和方法
Constructor getConstructor() 返回一个Constructor对象
Constructor [ ] getConstructors() 返回一个Constructor数组对象
3.2. 实例化对象(重点)
创建对象的方式,有new 、克隆、反序列化,再加一种,根据Class对象,使用newInstance() 或者构造器实例化对象。

import java.lang.reflect.Constructor;

// 通过反射
//   clz newInstance()
//     通过获取构造器, 利用构造器去创建对象
public class Demo004NewInstance {
    public static void main(String[] args) throws Exception {
        //1.获取Class
        Class<Person> aClass =(Class<Person>) Class.forName("com.shsxt.test.reflect.Person");
        //2.创建对象,必须保证空构造的存在,而且只能是调用空构造,属性是没有数据的
        Person p= aClass.newInstance();
        System.out.println(p);

        //获取指定构造器  获取空构造
         //获取所有的public 权限的构造器
        Constructor<Person> constructor = aClass.getConstructor();
        // 执行构造器,获取对应Bean对象
        Person person = constructor.newInstance();
        System.out.println(person);

        // 获取指定构造器  获取带参构造  String类型,  int类型
        Constructor<Person> constructor1 = aClass.getConstructor(String.class,int.class);
        //执行构造器
        Person amy = constructor1.newInstance("Amy", 18);
        System.out.println(amy);
    }
}

注意:newInstance()是调用空构造,如果空构造不存在,会出现异常。由此可知,使用其他构造器创建对象比较麻烦,使用空构造非常简单。确保空构造存在。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值