Java 反射类--Class
来源:互联网 发布:淘宝客佣金最低是多少 编辑:程序博客网 时间:2024/05/17 07:49
我们先来看反射提供的功能:
反射机制提供功能:加载运行时确定数据类型,解析类结构,获取内部信息
操作该类型或实例,访问属性,调用方法,创建新对象
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的依赖注入,动态代理,动过名称反射调用类的方法。但与此同时反射同时也带来的效率上的问题,凡事都有两面性,要灵活难免牺牲效率。
- Java 反射类--Class
- java反射:class类
- JAVA反射和CLASS类
- Java反射机制-class类
- Java反射机制--Class类
- Java反射之Class类
- java反射 之Class类
- Class类与JAVA反射
- java 反射 一 Class类
- JAVA的反射 class类
- java反射Class类详解
- java反射之Class类
- Java反射机制-Class类
- Java反射机制--Class类
- Class类与java反射
- java 反射基础知识class类
- 认识class类 JAVA的反射机制
- JAVA反射机制-class类的获取
- P51 第4题
- Android笔记二十八.Service组件入门(二).绑定本地Service并与之通信
- P51 第6题
- 在SQLServer 2005附加SQLServer 2008数据库异常处理
- 打印1-100之间的所有质数
- Java 反射类--Class
- leetcode single number2
- Thinkphp - 自定义模型(Model)
- void * 应用实例
- 【每周技术文】只有不停的训练,总结经验,不断学习才可以成长。
- 判断三角形的类型
- 素数
- design_pattern_derivative_randomnumber
- onbeforeunload 关闭浏览器 跳出