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的依赖注入,动态代理,动过名称反射调用类的方法。但与此同时反射同时也带来的效率上的问题,凡事都有两面性,要灵活难免牺牲效率。

1 0
原创粉丝点击