今天学习了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();
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦