From 159956a8cc054be32b762359461f274154ee8401 Mon Sep 17 00:00:00 2001 From: RyanSmith <875354601@qq.com> Date: Sun, 26 Jun 2016 12:53:34 +0800 Subject: [PATCH] =?UTF-8?q?[=E6=B7=BB=E5=8A=A0]=E5=8F=8D=E5=B0=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\345\217\215\345\260\204.md" | 162 ++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100644 "main/JAVA/\350\257\255\346\263\225\345\237\272\347\241\200\344\270\216\347\273\206\350\212\202/\345\217\215\345\260\204.md" diff --git "a/main/JAVA/\350\257\255\346\263\225\345\237\272\347\241\200\344\270\216\347\273\206\350\212\202/\345\217\215\345\260\204.md" "b/main/JAVA/\350\257\255\346\263\225\345\237\272\347\241\200\344\270\216\347\273\206\350\212\202/\345\217\215\345\260\204.md" new file mode 100644 index 0000000..ff376c8 --- /dev/null +++ "b/main/JAVA/\350\257\255\346\263\225\345\237\272\347\241\200\344\270\216\347\273\206\350\212\202/\345\217\215\345\260\204.md" @@ -0,0 +1,162 @@ + +- [JAVA中的反射机制](http://blog.csdn.net/liujiahan629629/article/details/18013523) + +- [java反射详解](http://www.cnblogs.com/rollenholt/archive/2011/09/02/2163758.html) +- [Java反射机制](http://www.cnblogs.com/jqyp/archive/2012/03/29/2423112.html) + +### 反射是什么 +> JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。----- +百度百科 + +### 反射能干什么 + +- 拿到类的类型 +- 判断对象是否属于反射得到的类 +- 通过类类型实例化一个类 +- 获取属性并修改 +- 获取方法并执行 +- 获取父类和接口 + +#### 这些功能组合起来可以做什么? +在框架中用的最多如:Spring中 +IOC DI + +当需要自己实现一个专用的小框架时,也会用到。 + +例子: +已包含实例: +1. 判断类型 +2. 拿到类的类型 +3. 新建一个类 +4. 获取方法并执行 +```java +class People implements Action{ + private String Name; + + public String getName() { + return Name; + } + + public void setName(String name) { + Name = name; + } + + @Override + public void say() { + // TODO Auto-generated method stub + System.out.println("People saying!"); + } +} +class Man{ + public Man(String name) { + super(); + Name = name; + } + + private String Name; + + public String getName() { + return Name; + } + + public void setName(String name) { + Name = name; + } +} +``` + +```java +interface Action{ + void say(); +} +``` + +```java +public class ReflectionTest { + + private static final Man man = new Man("Ryan"); + public static void main(String[] args) throws InstantiationException, IllegalAccessException, NoSuchFieldException, SecurityException, NoSuchMethodException, IllegalArgumentException, InvocationTargetException { + Class clazz = null; + try { + //clazz=Class.forName("People"); //错误用法,必须带包名的全称 + clazz=Class.forName("Reflection.People"); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + clazz = man.getClass(); + clazz = People.class; + + //判断class类型 + if(man instanceof Man){ + System.out.println("true"); + } + if(People.class.isInstance(man)){ + System.out.println("true"); + } + //新建一个类 + try { + People people = (People)clazz.newInstance(); + people.setName("RyanSmith"); + System.out.println(people.getName()); + } catch (InstantiationException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } + //newInstance调无参构造函数,man重载了构造函数,所以不会有默认的无参构造函数 + //这里会抛异常 + try { + Man man= Man.class.newInstance(); + man.setName("RyanSmith"); + System.out.println(man.getName()); + } catch (Exception e) { + e.printStackTrace(); + } + + Constructor[] constructors= Man.class.getConstructors(); + System.out.println(constructors[0]); + try { + Man man = (Man)constructors[0].newInstance("RyanSmith"); + System.out.println("构造函数初始化:"+man.getName()); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + //得到people类的接口 + Class[] interfaces = People.class.getInterfaces(); + for(Class interfacename:interfaces){ + System.out.println("interfacename:"+interfacename); + } + //得到man类的所有的属性 + clazz = Man.class; + Field[] fields= clazz.getDeclaredFields(); + System.out.println("Man fields.length: "+fields.length); + for(Field field:fields){ + System.out.println(field); + } + //得到某个属性并改变他 + //可能抛异常NoSuchFieldException + Field fieldName= clazz.getDeclaredField("name"); + fieldName.setAccessible(true); + fieldName.set(man, "othername"); + System.out.println(man.getName()); + + Method[] methods= clazz.getDeclaredMethods(); + System.out.println("Man methods.length: "+methods.length); + for(Method method: methods){ + System.out.println(method); + } + + //可能抛异常NoSuchMethodException + //调用set方法 + Method method= clazz.getMethod("setName",String.class); + method.invoke(man, "set by setmethod"); + method= clazz.getMethod("getName"); + System.out.println(method.invoke(man)); + } +} +``` + + + -- Gitee