Java反射学习笔记

Java反射学习记录

反射作用

通过Java反射机制,可以在程序中访问已经装载到JVM中的Java对象的描述,实现访问、检测和修改描述Java对象本身信息的功能。

获取一个类的三种方式

public class ReflectTest {
    public static void main(String[] args) throws ClassNotFoundException {
    //1.对象获取
        Person person = new Person();
        Class c1 = person.getClass();
    //2.类名获取
        Class c2 = Person.class;
     //3.Class类静态方法获取
        Class c3 = Class.forName("Person");
    }
}

获取公共构造方法以及实例化对象

        //获取全部公共的构造方法,以数组形式放回
        Constructor[] constructors = c.getConstructors();
        for (Constructor con:constructors){
            System.out.println(con);
        }
        //获取指定构造方法(公共的)
        Constructor constructor = c.getConstructor();
       // Constructor constructor = c.getConstructor(String.class,int.class);
       //实例化对象
       Object obj = constuctor.newInstance();
       //Object obj = constructor.newInstance("张三", 18);
       

获取非公共构造方法

public class ReflectTest1 {
    public static void main(String[] args) throws Exception {
        Class c1 = Class.forName("edu.swpu.day11.Person");
        Constructor con = c1.getDeclaredConstructor(int.class, String.class);
    //暴力反射AccessibleObject中的setAccessible设置为TRUE
       con.setAccessible(true);
       Object obj = con.newInstance(18, "李四")

获取成员属性getField

 public static void main(String[] args)throws Exception{
        Class c = Class.forName("Person");
        Object obj = c.newInstance();
        Field name = c.getField("name");
        name.set(obj,"王五");
        System.out.println(obj);
    }

获取类方法并运行


public static void main(String[] args)throws Exception{
        Class c = Class.forName("Person");
        Object obj = c.newInstance();
//        /*获取全部方法,不包含继承的*/
        Method[] methods = c.getDeclaredMethods();
        for (Method m:methods){
            System.out.println(m);
        }
        /*获取指定方法*/
        Method method = c.getMethod("eat");
        /*运行指定方法*/
        method.invoke(obj);
        
        Method run = c.getMethod("run", String.class, double.class);
        run.invoke(obj,"三毛",100.25);
    }

泛型擦除练习

此处通过直接使用反射技术,直接访问ArrayList的add方法,跳过了泛型的限制

public class ReflectTest7 {
    public static void main(String[] args) throws Exception {
        ArrayList<String> arr = new ArrayList<String>();
//        Class c = Class.forName("java.util.ArrayList");
//        Class c = ArrayList.class;
        Class c = arr.getClass();
        Method method = c.getMethod("add", Object.class);
        method.invoke(arr,1);
        method.invoke(arr,2);
        method.invoke(arr,3);
        method.invoke(arr,4);
        System.out.println(arr);
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值