手记

Java反射相关知识简单学习笔记

今天学习了Java反射相关知识,为避免遗忘做一些简单笔记

得到Class类的三种方法
//以下代码省略抛出异常步骤
@Retention(RetentionPolicy.RUNTIME)
public @interface Description {
    int value();
    String name();
    int age();
}
@Description 
Class A{
    private int id;
    public String name ;
    public static int count;
    public A(){
    }
    public void method(){
    }
    public void method(int a,int b){
    }
    public String method(String a,String b){
        return a+b;
    }
}
Class clazz = null;
//方法1:class属性
clazz  = A.class;

A a = new A();
//方法2:getClass()方法
clazz  = a.getClass();

//方法3:Class.forName("类的全限定名");
clazz  = Class.forName("A");//动态加载类
Class类的常用方法相关操作
//接上段代码
//得到类的全名
clazz.getName();
//得到类的不包含包名的名称
clazz.getName();

//得到类方法的方法
Method m1 = clazz.getMethod("method");//参数为方法名
Method m2 = clazz.getMethod("method",int.class,int.class);//参数为方法名和method方法参数类型的类类型
Method m3 = clazz.getMethod("method",String.class,String.class);//参数为方法名和method方法参数类型的类类型
Method[] m4 = clazz.getMethods()//得到类的所有public的方法
Method[] m5 = clazz.getDeclaredMethods()//得到类自己声明的方法,不限权限
//得到构造函数的方法
Constructor[] cs1= clazz.getConstructors();//得到类的所有public的构造方法
Constructor[] cs2 = clazz.getDeclaredConstructors();//得到类自己声明的构造方法,不限权限
Constructor c1= clazz.getConstructor()//得到类的无参构造方法
Constructor c2 = clazz.getConstructor(int.class,int.class);//得到类的有参构造方法
//得到成员变量
Field[] fs1 = clazz.getDeclaredFields();//得到该类自己声明的成员变量信息
Field[] fs2 = clazz.getFields();//得到所有的public的成员变量的信息
Field field1 = clazz.getField(“name”);//得到名为name的字段(成员变量)
Field field2 = clazz.getDeclaredFields(“name”);//无视权限得到名为name的字段(成员变量)
Field field3 = clazz.getField(“count”);//得到名为count的静态成员
//得到类的实例(动态加载类)
//Class.newInstance();只能使用无参构造创建实例,不能访问私有成员
A a1= (A)clazz.newInstance();
//Constructor.newInstance();满足某些条件则能访问私有成员
A a2 = (A)cs3.newInstance();//使用无参构造创建实例
A a3 = (A)cs4.newInstance(10,20);//使用有参构造创建实例

//得到注解
Annotation annotation = clazz.getAnnotation(Description.class);//根据注解的类类型得到一个注解
Annotation[] annotations = clazz.getAnnotations();//得到所有注解
annotations = clazz.getAnnotationsByType(Description.class);/根据注解的类类型/得到所有注解

boolean isExist =  clazz.isAnnotationPresent(Description.class);//根据注解的类类型判断一个类是否有该类型的注解
AnnotatedType[] ac = clazz.getAnnotatedInterfaces();//得到该类的所有注解的类类型数组。

//使用得到的method方法
m1.invoke(a1);//无参方法(方法.invoke(方法所在类的实例对象);)
m1.invoke(a1,20,30);//有参方法(方法.invoke(方法所在类的实例对象,参数列表..);)

//得到方法参数列表
Class[] paramTypes = m1.getParameterTypes();
for (Class clazz1: paramTypes) {
    //clazz1为参数类型的类类型
    String TypeName = clazz1.getName();//得到方法的参数类型名称
}
//得到返回值类型
Class returnType = m1.getReturnType();

//获取构造函数的参数列表--->得到的是参数列表的类类型
Class[] paramTypes = cs4.getParameterTypes();
for (Class clazz1: paramTypes) {
    //clazz1为参数类型的类类型
    String TypeName = clazz1.getName();//得到构造方法的参数类型名称
}

//得到实例a1的成员变量的值
field1.get(a1);//参数为类的实例
//得到类A的静态成员变量的值
field1.get(null);//参数为null或"",不填亦可
//得到成员变量的类型的类类型
Class fieldType = field1.getType();
//得到成员变量的名称
String fieldName = field1.getName();
0人推荐
随时随地看视频
慕课网APP