Java 反射类--Class
我们先来看反射提供的功能:
反射机制提供功能:加载运行时确定数据类型,解析类结构,获取内部信息
操作该类型或实例,访问属性,调用方法,创建新对象
java反射是谁来提供呢?
Class对象提供,但是首先需要通过JVM获取对象,创建Class对象
创建Class对象有三种方式:
使用Class类的forName()静态方法如:Class.forName(java.lang.reflect.Field)
调用类的class书香获取对应的Class对象,
调用某个对象的getClass()方法
获取Class对象,就可以得到对象的真实信息
如:对象的构造函数,属性,方法,注解,接口,父类,注解(必须是具有源码,否则注解不能查询到)等
如:
Constructor<?>getconstructors()返回class对象标识的所有public 构造器 Method[] getMethods() FieldgetField(String name) Annotation[]getAnnotations()
以上方法是有多重载的,可根据参数类型获取不同如 class.getMethod("info",String.class)
反射能做什么?
以上是通过反射获取对象,取得对象的属性方法
同时反射还可以生成对象以及操作对象的方法,形成动态代理的基础,ORM的基础
创建对象方式
使用Class对象newIntance()创建class对象实例,但必须有默认构造器
或使用class对象指定的构造器,再调用newInstance方法,可以创建指定实例
事例
获取某个对象,并创建该对象调用该对象方法
1 POJO类
public class User { private String userName; private String password; public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public User(){ } public User(String username){ this.userName=username; }
2 调用类与实例
public static void main(String[] args) throws SecurityException, NoSuchFieldException, InstantiationException, IllegalAccessException, NoSuchMethodException, ClassNotFoundException { getProperty(User.class);//调用 } public static void getProperty(Class<?> entityClass) throws SecurityException, NoSuchFieldException, InstantiationException, IllegalAccessException, NoSuchMethodException, ClassNotFoundException { //-----start----反射获取对象--------- String cName = entityClass.getName(); // 从类的名字中解析出类名 String userName = cName.substring(cName.lastIndexOf(".") + 1, cName.length()); System.out.println("实体名称为:"+ userName); // 获取对象的所有属性 Field[] fields = entityClass.getDeclaredFields(); // 获取对象的所有方法 Method[] methods = entityClass.getDeclaredMethods(); List<String> listfeld = new ArrayList<>(); for (Field field : fields) { System.out.println("属性名称有:" + field.getName()); } for (Method method : methods) { System.out.println("方法名称有:" + method.getName()); } //-------反射获取对象-end--------+ //反射创建对象,调用对象方法-------start-------- User userfroname = (User) Class.forName(cName).newInstance(); //获取Class对象方式1 :通过字符串 User userClass = (User) entityClass.newInstance(); //获取Class对象方式2: 通过Class类型 userClass.setUserName("我的大名是:任秋明---通过class名称创建对象"); userfroname.setUserName("我的大名是:任秋明--Class类型创建对象"); System.out.println(userClass.getUserName()); System.out.println(userfroname.getUserName()); //反射创建对象,调用对象方法-------end-------- }
3 测试结果
实体名称为:User
属性名称有:userName
属性名称有:password
方法名称有:getUserName
方法名称有:setUserName
方法名称有:setPassword
方法名称有:getPassword
我的大名是:任秋明---通过class名称创建对象
我的大名是:任秋明--Class类型创建对象
小结:
总的来说,java反射机制可以解决一些不灵活的程序,IOC的依赖注入,动态代理,动过名称反射调用类的方法。但与此同时反射同时也带来的效率上的问题,凡事都有两面性,要灵活难免牺牲效率。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。