安卓复习之旅—Java反射机制

来源:互联网 发布:数据库表关联 编辑:程序博客网 时间:2024/06/03 14:38

Java反射机制定义
Java反射机制是指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
用一句话总结就是反射可以实现在运行时可以知道任意一个类的属性和方法。

反射机制的优点与缺点
为什么要用反射机制?直接创建对象不就可以了吗,这就涉及到了动态与静态的概念
静态编译:在编译时确定类型,绑定对象,即通过。
动态编译:运行时确定类型,绑定对象。动态编译最大限度发挥了java的灵活性,体现了多态的应用,有以降低类之间的藕合性。

优点
可以实现动态创建对象和编译,体现出很大的灵活性;

缺点
对性能有影响。使用反射基本上是一种解释操作,我们可以告诉JVM,我们希望做什么并且它满足我们的要求。这类操作总是慢于只直接执行相同的操作。

Java反射获取类的属性
1得到类的对象

public class ReflectDemo {
public static void main(String[] args) throws ClassNotFoundException {
//第一种:Class c1 = Code.class;
Class class1=ReflectDemo.class;
System.out.println(class1.getName());

    //第二种:Class c2 = code1.getClass();    ReflectDemo demo2= new ReflectDemo();    Class c2 = demo2.getClass();    System.out.println(c2.getName());    //第三种:Class c3 = Class.forName("com.lin.reflect.Code");    Class class3 = Class.forName("com.lin.reflect.ReflectDemo");    System.out.println(class3.getName());}

}
执行结果:

com.lin.reflect.ReflectDemocom.lin.reflect.ReflectDemocom.lin.reflect.ReflectDemo

获取成员方法Method

public Method getDeclaredMethod(String name, Class<?>... parameterTypes) // 得到该类所有的方法,不包括父类的public Method getMethod(String name, Class<?>... parameterTypes) // 得到该类所有的public方法,包括父类的

两个参数分别是方法名和方法参数类的类类型列表。
demo片段:

public void info(String name,int age) {
System.out.println(“我叫”+name+”,今年”+age+”岁”);
}
Class c = Class.forName(“com.tengj.reflect.Person”); //先生成class
Object o = c.newInstance(); //newInstance可以初始化一个实例
Method method = c.getMethod(“info”, String.class, int.class);//获取方法
method.invoke(o, “lin”, 10); //通过invoke调用该方法,参数第一个为实例对象,后面为具体参数值

运行结果:

我叫lin,今年10岁

获取成员变量Field

public Field getDeclaredField(String name) // 获得该类自身声明的所有变量,不包括其父类的变量
public Field getField(String name) // 获得该类自所有的public成员变量,包括其父类变量

获取构造函数Constructor

 public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) //  获得该类所有的构造器,不包括其父类的构造器public Constructor<T> getConstructor(Class<?>... parameterTypes) // 获得该类所以public构造器,包括父类

注意:Class的newInstance方法,只能创建只包含无参数的构造函数的类,如果某类只有带参数的构造函数,那么就要使用另外一种方式:fromClass.getDeclaredConstructor(String.class).newInstance(“lin”);

0 0