java反射
Posted 等你的夏天
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java反射相关的知识,希望对你有一定的参考价值。
在java程序运行状态中,对于任意一个类,可以获取其所有的属性和方法,对于任意一个对象可以动态的调用其方法获取其属性。我们称这种特性为java反射。
应用:
在程序运行过程中,动态实现以下操作:
1)通过反射创建对象
a. Class.newInstance()
b. Construction.newInstance()
//通过反射创建对象 //1、通过newInstance创建对象,调用无参构造 Student student=studentClass.newInstance(); //2、通过构造器创建对象 Constructor<Student> constructor = studentClass.getDeclaredConstructor(); //设置是否允许访问,当private方法设置为true后,可以直接调用 constructor.setAccessible(true); //通过构造器调用对象 Student student1 = constructor.newInstance(); Student student2 = constructor.newInstance(); System.out.println(student1==student2);//false
2)通过反射获取对象的类型,属性,方法,构造
/** * 演示获取类的各种信息 */ public static void getClassInfo() throws NoSuchFieldException { Class<Student> studentClass = Student.class; //获取类上的注解 Annotation[] annotations=studentClass.getAnnotations(); //根据名称获取单个属性 Field name=studentClass.getField("name"); name.setAccessible(true); LogData annotation = name.getAnnotation(LogData.class); Field[] fields = studentClass.getFields();//获取类中的public属性 Field[] declaredFields = studentClass.getDeclaredFields();//获取类中定义的所有属性 //获取类的方法 Method[] methods = studentClass.getMethods();//获取类中的public的方法(包含父类方法) Method[] declaredMethods = studentClass.getDeclaredMethods();//获取类中定义的所有方法 //获取实现的接口 Class<?>[] interfaces = studentClass.getInterfaces(); //获取类的父类 Class<? super Student> superclass = studentClass.getSuperclass(); //包含包名的类名 String name1 = studentClass.getName(); //不包含包名的类名 String simpleName = studentClass.getSimpleName(); }
3)动态调用对象的方法,获取对象的属性
4)获取方法或属性上的注解信息
反射中涉及到的常用类
1) Class类:用来描述类信息的类
2) Method类:用来描述方法的类
3) Field类:用来描述属性的类
4) Construction类:用来描述构造方法
获取Class对象的方式
1) 类名.class
2) 对象.getClass();
3) Class.forName(“类的全路径”)
//获取class对象,一个类只有一个Class对象 Class<Student> studentClass=Student.class; Class<? extends Student> aClass=new Student().getClass(); Class<?> aClass1=Class.forName("entity.Student"); System.out.println(studentClass==aClass);//true System.out.println(studentClass==aClass1);//true
以上是关于java反射的主要内容,如果未能解决你的问题,请参考以下文章
使用反射在外部JAR / CLASS上调用包含Hibernate事务的方法(Java EE)