jAVA反射机制是在运行状态中,对于任意一个类,都可以知道这个类的全部属性和方法;对于任意一个对象,都可以调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。java
众所周知哈 java ,c++,c#这类语言不属于动态语言;而目前的结论是 在程序运行状态中能容许改变变量类型和程序结构的被称之为动态语言;可是java Reflection 具有看透class 的能力这种能力被称为introspection (内省,内观) (面试重点 须要的同窗能够自行百度详细了解一下 我能力有限讲不明白)(只有java 提供反射机制 像c++,c#等 非动态语言没有提供)c++
java 反射机制提供的功能 (注意:大前提是在运行状态下):面试
java 反射机制的主要类 主要位于 java.lang.reflet c#
Class类 表明一个类
Java 经过反射获取某个类里全部的方法 直接上代码 :数组
java获取class 类的三种方法:测试
/* 实例 操做 */ public static void main(String[] args ) throws ClassNotFoundException { /*得到字符串服表示的类的 class 对象*/ Class<?> aClass= Class.forName("java.lang.String"); /* 能够获取里面 的全部方法 */ Method[] methods = aClass.getDeclaredMethods(); for(Method method : methods){ System.out.println(method); }
结果 :this
java 反射动态的调用某个类的特定的方法 首先要获取该类的Method 方法 对于类的成员变量和构造方法相似 首先要获取 Filed 和 Constroutorspa
/*普通方法 */ public int add (int a,int b) { return a+b; } public static void main(String[] args ) throws Exception { /* 经过 .class 方法 获取 该类中的全部对象 */ Class<?> aClass = Reflections.class; /* 生成该类的实例化对象 建立一个新的实例 */ Object reflection = aClass.newInstance(); /* 判断 reflectiong 是不是 Reflections 的实例 返回结果为true */ System.out.println( reflection instanceof Reflections ); /* 经过这个类的 getmethod 方法获取到 该类的 add 方法 */ Method add = aClass.getMethod("add",new Class[]{int.class,int.class}); /*反射方式 操做获取到的方法 */ Object result = add.invoke(reflection,new Object[]{1,2}); System.out.println((Integer)result); //結果為3 }
/* 完成对 gflection 的拷贝工做 */ public Object copy (Object object) throws Exception { Class<?> aClass = object.getClass(); System.out.println(aClass); /* 获取构造方法 */ Constructor con = aClass.getConstructor(new Class[]{String.class,int.class}); Object gbj = con.newInstance(new Object[]{"杨一",1}); System.out.println(gbj); /*得到独享的全部成员变量*/ Field[] fields = aClass.getDeclaredFields(); for (Field field :fields){ String name = field.getName(); System.out.println(name); } return null; } public static void main(String[] args) throws Exception{ Reflections reflections = new Reflections(); reflections.copy(new gflection()); } } /* 类 */ class gflection { private int age; private String name; /* 第一个构造方法 */ public gflection(){ } /* 带参数的构造方法 */ public gflection(String name,int age){ this.age = age; this.name = name; } /*get set 方法*/ public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; }
附上测试代码:code
import javafx.scene.effect.Reflection; import javax.xml.ws.spi.Invoker; import java.io.File; import java.lang.reflect.*; /** * Created by 杨一 on 2017/5/4. */ public class Reflections { /* *//* 实例 操做 *//* public static void main(String[] args ) throws ClassNotFoundException { *//*得到字符串服表示的类的 class 对象*//* Class<?> aClass= Class.forName("java.lang.String"); *//* 能够获取里面 的全部方法 *//* Method[] methods = aClass.getDeclaredMethods(); for(Method method : methods){ System.out.println(method); } }*/ /* *//*普通方法 *//* public int add (int a,int b) { return a+b; }*/ /* public static void main(String[] args ) throws Exception { *//* 经过 .class 方法 获取 该类中的全部对象 *//* Class<?> aClass = Reflections.class; *//* 生成该类的实例化对象 建立一个新的实例 *//* Object reflection = aClass.newInstance(); *//* 判断 reflectiong 是不是 Reflections 的实例 返回结果为true *//* System.out.println( reflection instanceof Reflections ); *//* 经过这个类的 getmethod 方法获取到 该类的 add 方法 *//* Method add = aClass.getMethod("add",new Class[]{int.class,int.class}); *//*反射方式 操做获取到的方法 *//* Object result = add.invoke(reflection,new Object[]{1,2}); System.out.println((Integer)result); //結果為3 }*/ /* 完成对 gflection 的拷贝工做 */ public Object copy (Object object) throws Exception { Class<?> aClass = object.getClass(); System.out.println(aClass); /* 获取构造方法 */ Constructor con = aClass.getConstructor(new Class[]{String.class,int.class}); Object gbj = con.newInstance(new Object[]{"杨一",1}); System.out.println(gbj); /*得到独享的全部成员变量*/ Field[] fields = aClass.getDeclaredFields(); for (Field field :fields){ String name = field.getName(); System.out.println(name); } return null; } public static void main(String[] args) throws Exception{ Reflections reflections = new Reflections(); reflections.copy(new gflection()); } } /* 类 */ class gflection { private int age; private String name; /* 第一个构造方法 */ public gflection(){ } /* 带参数的构造方法 */ public gflection(String name,int age){ this.age = age; this.name = name; } /*get set 方法*/ public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } }