java反射

本文深入解析Java反射机制,包括Class类的作用、如何使用反射创建对象、访问私有成员及调用方法等内容。同时介绍了通过反射获取类信息及操作的具体方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 什么是Class
 java中的用于描述事物的属性功能
Class类用于描述这些的共性--->字节码数据
字节码-->创建多个对象
例如:
        //类的字节码
        Class<?> dateClass1=java.util.Date.class;
       //对象所属类的字节码
        java.util.Date da=new java.util.Date();
        Class<?> dateClass2=da.getClass();
        //通过类所在路径加载类的字节码,反射多用这种方法
        Class<?> dateClass3= Class.forName("java.util.Date");
九个预定义的Class对象八个基本类型(byte short int char boolean float double lang)和void

总结:
    字节码创建类,类创建对象-->通过对象找到类,通过类找到字节码(Class)
    基本类型的字节码和引用类型的字节码不是同一个内存地址
    int.class==Integer.TYPE;基本数据类型对应的包装类的TYPE属性为基本数据类型的字节码
    基本类型的数组的字节码不是基本类型的字节码(用字节码的isPrimitive()方法判断)
    判断字节码是不是数组的方法(Class.isArray());
    只要在源程序出现的类型都有对应的Class实例对象
    反射会消耗程序性能
    2.什么是反射
           反射就是把java类中的各种成分映射成对应的java类
           描述构成类的成分的类:Field,Method,Constructor,Package...

           Constructor:构造方法,由Constructor创建一个对象
          无参构造方法:
          例如:
                 String str=java.lang.String.class.newInstance();
           有参构造方法:
           例如:
                Constructor con=java.lang.String.class.getConstructor(StringBuffer.class);
                String newInstance = (String) con.newInstance(new StringBuffer("hehe"));

           Filed:字段的反射

             //Person类用于测试
             
 package com.test;
public class Person {
    public String uname;
    private String passd;
 
    public String getPassd() {
        return passd;
    }
    public void setPassd(String passd) {
        this.passd = passd;
    }
    public Person(String uname, String passd) {
        super();
        this.uname = uname;
        this.passd = passd;
    }
}


                 //反射创建Person对象
        Person p=(Person)Class.forName("com.test.Person").getConstructor(String.class,String.class).newInstance(new String("hehehe"),new String("123he"));
        //获取对象的公有字段和
        Field field=com.test.Person.class.getField("uname");
        String uname=(String) field.get(p);
        System.out.println(uname);
        //获取对象的非公有字段
        Field field1=com.test.Person.class.getDeclaredField("passd");
        field1.setAccessible(true);
        String passd=(String) field1.get(p);
        System.out.println(passd);

       //改变对象里的所有公有String字段
Field [] fields=com.test.Person.class.getFields();//只能获取公有字段
        for (Field f : fields) {
            if(f.getType()==String.class){
                    String oldfield=(String)f.get(p);
                    String newfield=oldfield.replace("h", "g");
                    f.set(p, newfield);
            }
        }

//数组的反射
 String [] str1=new String[]{"a","b","c"};
       Class c=str1.getClass();
       if(c.isArray()){
           int len=Array.getLength(str1);
           for (int i = 0; i < len; i++) {
            System.out.println(Array.get(str1, i));
        }
       }



Method 类方法的反射
Method me=String.class.getMethod("charAt", int.class);
       //方法对象me的invoke方法
       System.out.println(  me.invoke(uname, 2));


       当uname为null时表示调用静态方法,以后参数为可变长度的方法参数

通过反射,获得方法参数泛型里的参数类型
public class Test {
    
    public static void main(String[] args) {
        Vector<Person> plist=new Vector<Person>();
        
        try {
            Method me=Test.class.getMethod("getT", Vector.class);
            Type[] types = me.getGenericParameterTypes();
            ParameterizedType type=    (ParameterizedType)types[0];
            System.out.println(type.getRawType());
            System.out.println(type.getActualTypeArguments()[0]);
        } catch (SecurityException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
    }
    public void getT(Vector<Person> plist){
        
    }
}

输出:
class java.util.Vector
class com.test.Person


欢迎留言交流

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值