JAVA学习历程记录(十一)——反射

这篇博客详细记录了JAVA学习过程中的反射部分,包括如何获取字节码对象、构造方法、属性、方法、枚举、父类和接口,以及利用反射进行名字、简称名字和包名的获取。此外,还探讨了如何通过反射判断相关方法,理解Field类和Method类的使用,并通过实例展示了如何用反射实现Object类的clone方法。

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

JAVA学习历程记录(十一)

反射

获取字节码对象

Class<String> clz = String.class;
        Class<Person> per = Person.class;
        Class<int[]> clz1 = int[].class;
//        System.out.println(clz);
//        System.out.println(per);
//        System.out.println(clz1);
        Object o = "abc";
        System.out.println(o.getClass());
//        Class<Date> clz3 = (Class<Date>)Class.forName("java.util.Date");
        Class<Date> clz3 = (Class<Date>) Class.forName("java.util.Date");

获取构造方法

//获取有参
        Constructor<String> cs = clz.getDeclaredConstructor(char[].class);
        //创建对象
        String str = cs.newInstance(new char[]{'a','b','c'});
//        System.out.println(str);
        Constructor<Person> cp = per.getDeclaredConstructor();
        Constructor<Person> cp2 = per.getDeclaredConstructor(int.class,String.class);
        Person p = cp.newInstance();
        Person p2 = cp2.newInstance(5,"asd");

获取属性

Field f = clz.getDeclaredField("hash");
f.setAccessible(true);
System.out.println(f);
String str = "asdfasdf";
f.set(str,10);
System.out.println(f.get(str));
//给字符串的哈希值赋值
Field[] f1 = clz.getDeclaredFields();
for (Field field : f1) {
    System.out.println(field);
}
Constructor<Person> cp = per.getDeclaredConstructor();
Constructor<Person> cp2 = per.getDeclaredConstructor(int.class,String.class);
//创建实例化对象
Person p = cp.newInstance();
//寻找属性,fp代表这个属性
Field fp = per.getDeclaredField("age");
//暴力破解
fp.setAccessible(true);
//修改fp的值,即修改age的值
fp.set(p,5);
输出fp
System.out.println(fp.get(p));

获取方法

Constructor<Person> cp = per.getDeclaredConstructor();
        Constructor<Person> cp2 = per.getDeclaredConstructor(int.class,String.class);
//        Person p = cp.newInstance();

        Method mp = per.getDeclaredMethod("weight", int.class);
        mp.setAccessible(true);
        //p的位置就放构造方法的实例化
//        int a = (int) mp.invoke(p,15);
        int a = (int) mp.invoke(cp.newInstance(),15);
        System.out.println(a);

获取枚举

Class cle = String.class;
Mum[] muns = (Mum[]) cle.getEnumConstants();
for (Mum mum : muns) {
    System.out.println(mum);
}
enum Mum{
    a,b,c,d;
}

获取父类

Class pa = per.getSuperclass();
System.out.println(pa);
Constructor con = pa.getDeclaredConstructor();
Pa pas = (Pa) con.newInstance(); //实例化
con.setAccessible(true); 
Field fa = pa.getDeclaredField("a");
fa.setAccessible(true);
fa.set(pas,5);    
System.out.println(fa.get(pas));
Method method = pa.getDeclaredMethod("abc",int.class);
method.setAccessible(true);
int i = (int) method.invoke(pas,7);
System.out.println(i);

获取接口

Class[] cli = clz.getInterfaces();
for (Class c : cli) {
    Method[] m = c.getDeclaredMethods();
    System.out.println(m);
}

获取名字

per.getName();

获取简称名字

per.getSimpleName();

获取包名

per.getPackage();
per.getTypeName();

判断相关方法

//判断是否是匿名类
isAnonymousClass();
//判断是否是数组
isArray();
//判断是否是枚举
isEnum();
//判断是否是接口
isInterface()//判断是否是基本数据类型
isPrimitive();
//判断类与对象之间的关系
isInstance();
//判断类与接口的实现关系
isAssignableFrom();

Field类和Method类

Class person = Person.class;
Person pi = (Person) person.newInstance();
Field[] field = person.getDeclaredFields();
for (Field f : field) {
    //打印属性名和属性类型
    System.out.println(f.getName()+" " +f.getType());
}

Method method = person.getDeclaredMethod("weight", int.class);
//获取参数个数
System.out.println(method.getParameterCount());
//获取全部参数类型
Class[] cs = method.getParameterTypes();
for (Class c : cs) {
    System.out.println(c);
}
//获取返回值类型
System.out.println(method.getReturnType());
//获取方法中的泛型
System.out.println(method.getTypeParameters());

联系

用反射实现Object类的clone方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值