java的反射操作

本文深入探讨了Java反射机制,包括通过不同方式获取Class对象、类加载器的工作原理、类成员的获取与操作,以及泛型和注解的使用。通过实例展示了如何通过反射调用方法、访问属性,并解析了泛型参数类型和注解信息。
摘要由CSDN通过智能技术生成
package rejava3.反射;

import java.lang.annotation.Annotation;
import java.lang.annotation.ElementType;
import java.lang.reflect.*;
import java.util.List;
import java.util.Map;
import java.util.Properties;

public class TestReflection {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
        Class c1=TClass.class;       //最安全可靠,程序性能最高
        TClass c=new TClass();
        Class c2=c.getClass();       //通过对象获得Class对象
        Class c3= Class.forName("rejava3.反射.TClass");  //通过路径获得Class对象

        Class l1=Object.class;      //类    可以反射的
        Class l2=Comparable.class;  //接口  java.lang.Comparable
        Class l3=String[].class;    //数组  元素类型一样长度不一样,也是同一个hashCode
        Class ll3=String[][].class; //二维数组
        Class l4=Override.class;    //注解
        Class l5=Enum.class;//枚举
        Class l6=Integer.class;     //基本数据类型
        Class l7=void.class;        //void
        Class l8=Class.class;       //Class


        System.out.println("===========================================2.类加载器获取============================================");

        //获取系统类加载器
        ClassLoader systemClassLoader = ClassLoader.getSystemClassLoader();

        //获取系统类加载器的父类,扩展类加载器
        ClassLoader parent = systemClassLoader.getParent();
        
        //获取扩展类加载器的父类,根类加载器(C/C++)
        ClassLoader parent1 = parent.getParent();

        ClassLoader classLoader = Class.forName("rejava3.反射.TClass").getClassLoader();
        System.out.println(classLoader);      //AppClassLoader,系统类加载器
        ClassLoader classLoader1 = Class.forName("java.lang.Object").getClassLoader();
        System.out.println(classLoader1);     //根加载器,null


        System.out.println("===========================================3.类成员获取==============================================");


        Class s1=TClass.class;
        System.out.println(s1.getName());                   //获得该类名
        Field[] declaredFields = s1.getDeclaredFields();    //获得所有属性
        Field[] fields = s1.getFields();                    //获得public属性
        Field age=s1.getField("age");                 //获得指定的属性,getField只能获得public的
        System.out.println(s1.getDeclaredField("name"));
        
        Method[] methods = s1.getMethods();                 //获得本类所有public方法,父类继承的也算
        Method[] declaredMethods = s1.getDeclaredMethods(); //获得本类所有自己写的方法,构造方法不是
        Method id = s1.getMethod("tt",int.class);   //获得指定方法   ("方法名","方法所需参数的Class"),识别重载
        System.out.println(s1.getDeclaredMethod("getAge"));

        Constructor[] constructors = s1.getConstructors();
        Constructor[] declaredConstructors = s1.getDeclaredConstructors();
        Constructor constructor = s1.getConstructor(null);
        Constructor declaredConstructor = s1.getDeclaredConstructor(String.class);//参数用类型的Class对象,大家都是反射体谅一下


        System.out.println("===========================================4.操作成员===============================================");

        //得到对象
        TClass tc1=TClass.class.newInstance();       //Class.newInstance()调用类的无参数构造方法,返回Object对象
        TClass tc2=TClass.class.getDeclaredConstructor(String.class).newInstance("有参"); //获得构造器,利用构造器传参实例化对象

        //操作方法
        Method tt = s1.getDeclaredMethod("tt", int.class);
        tt.invoke(tc1,1111);        //Class对象.getMethod获取的方法.invoke(激活对象,激活参数)激活,自动算是调用了

        //操作属性
        Field name=s1.getDeclaredField("name");
        name.setAccessible(true);  //关掉这个反射对象的安全检测(java语言安全检测开关),公私有就忽略了,可以提高反射效率
        name.set(tc1,"女");        //不能直接操作私有属性


        System.out.println("===========================================5.泛型==================================================");


        Method testF2=s1.getDeclaredMethod("testF2", Map.class, List.class);
        Type[] genericParameterTypes1 = testF2.getGenericParameterTypes();  //获取方法的泛型参数类型
        //[java.util.Map<java.lang.String, java.lang.Integer>,java.util.List<java.lang.Integer>]
        for (Type type : genericParameterTypes1) {
            if(type instanceof ParameterizedType){        //参数化类型
                Type[] actualTypeArguments = ((ParameterizedType) type).getActualTypeArguments();//获得里面真实参数类型
                for (Type actualTypeArgument : actualTypeArguments) {
                    System.out.println(actualTypeArgument);
                }
            }
        }

        Method testF1=s1.getDeclaredMethod("testF1",null);
        Type genericReturnType = testF1.getGenericReturnType();  //获取方法的泛型返回值类型
        if(genericReturnType instanceof ParameterizedType){        //参数化类型
            Type[] actualTypeArguments = ((ParameterizedType) genericReturnType).getActualTypeArguments();
            for (Type actualTypeArgument : actualTypeArguments) {
                System.out.println(actualTypeArgument);

            }
        }


        System.out.println("===========================================6.注解==================================================");

        Annotation[] annotations = s1.getAnnotations(); //获得类注解对象
        for (Annotation annotation : annotations) {
            System.out.println(annotation);
        }

        TC tc=(TC)s1.getAnnotation(TC.class);      //获得指定注解对象
        System.out.println(tc.val());             //指定注解对象参数值

        Field name1 = s1.getDeclaredField("age");
        TF annotation = name1.getAnnotation(TF.class);      //获得属性注解对象
        System.out.println(annotation.type());                 //指定属性注解对象的参数值
        System.out.println(annotation.length());
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值