浅谈Java反射
Posted lemonxu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈Java反射相关的知识,希望对你有一定的参考价值。
一、何为反射
反射就是对于任何一个类都能知道这个类的的所有属性和方法,并且对于任何一个对象都能调用他的属性和方法,而且能修改其属性。
二、反射的作用
就我的理解来看,通常我们在写代码的时会非常强调代码的逻辑,Java中类之间的链接非常重要,造成很多时候代码耦合度过高,这时会造成很多问题。当使用反射来调用属性和方法时会降低代码的耦合度,更加方便。
三、示例
这里我写了一个完整的逻辑,其中运用了多个反射类。
定义两个接口:
package None8; public interface earth { }
package None8; public interface animal { }
定义一个父类,为了简化没有写方法和属性:
package None8; public class simplePerson { }
定义一个person类继承上面两个接口和父类:
package None8; public class person extends simplePerson implements animal,earth{ String name; int age; public void shwo() { String s = String.format("姓名=%s,年龄=%d", name,age); System.out.println(s); } public person() { } //这里的构造函数一定要设为public,不然通过动态加载类创建对象时会报错,读取不到这个构造函数 public person(String name,int age){ this.name = name; this.age = age; } }
客户端类,运用反射来创建并初始化对象,查看类的继承关系和方法:
package None8; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; public class client { public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { // TODO Auto-generated method stub //通过反射,动态加载对象 //无参构造函数 //Class<?> 泛型 里面的?表示可以处理所有是通配符,里面的person表示处理person类 Class<?> c =Class.forName("None8.person"); person n =(person)c.newInstance(); n.name = "lemon"; n.age = 22; n.shwo(); //通过反射得到所有构造函数getConstructors //这里有多个构造函数,上面的那个不能加载有参数的构造函数 //通过getConstructors来得到所有的构造函数,构造函数存放在数组中 //注意,构造函数一定要设为public,不然会报错 Constructor<?>[] cons = c.getConstructors(); person m = (person) cons[1].newInstance("sunk",30); m.shwo(); //通过反射得到所有接口getInterfaces //可以将所有继承的接口都展示出来 //接口同样存放在数组中 System.err.println("接口有:");
Class<?>[] inter = c.getInterfaces(); for (int i = 0;i < inter.length;i++) { System.err.println(inter[i].getName()); } System.err.println("父类有:"); //通过反射得到所有父类getSuperclass //Class<? super Object> superc = (Class<? super Object>) c.getSuperclass(); System.err.println(c.getSuperclass().getName()); } }
运行结果:
三、总结
我在刚接触反射的时最疑惑的就是我们之前通常用的new和反射中Class.forName()与Class.forName().newInstance()三者之间的关系。后来通过查询资料了解了。new只是一个关键字,后两者都是Class类下的方法。Class.forName()在反射中用来动态加载类,创建的对象的类型为该类的类型,这就可以看出来单单使用Class.forName()这个方法所创建的对象我们是无法使用的,这时就要使用newInstance()方法静态方法来实例化对象。
这里仅仅只是我对反射的浅显的理解,一边学习一边分享!
如有错误,希望大家能指正,感谢!
努力努力再努力!
以上是关于浅谈Java反射的主要内容,如果未能解决你的问题,请参考以下文章