1、反射机制
动态语言:是一类在运行时可以改变其结构的语言,主要有Python,PHP,JavaScript等。
静态语言:运行时结构不可变,如Java,C,C++。但Java可以称为”准动态语言“,即Java有一定的动态性,可以利用反射机制获得类似动态语言的特性。Java的动态性让编程的时候更加灵活。
Reflection(反射)是Java被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。
Class c = Class.forName("java.lang.String")
加载完类之后,在堆内存的方法区中就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象就包含了完整的类的结构信息。我们可以通过这个对象看到类的结构。这个对象就像一面镜子,透过这面镜子看到类的结构,所以,我们形象的称为:反射。
正常方式:
引入需要的”包类“名称——>通过new实例化——>取得实例化对象
反射方式:
实例化对象——>getClass()方法——>得到完整的”包类“名称
2、获得反射对象
Java反射机制提供的功能:
优点:可以实现动态创建对象和编译,体现出很大的灵活性。
缺点:对性能有影响。使用反射基本上是一种解释操作,我们可以告诉JVM,我们希望做什么并且它满足我们的要求。着类操作总是慢于直接执行相同的操作。
反射相关的主要API:
Class类:在Object类中定义了以下的方法,此方法将被所有子类继承
public final Class getClass()
以上的方法是返回值的类型是一个Class类,此类是Java反射的源头,实际上所谓反射从程序的运行结果来看也很好理解,即:可以通过对象反射求出类的名称。
1 public class TestReflection { 2 public static void main(String[] args) throws ClassNotFoundException { 3 //通过反射获取类的Class对象 4 Class c1 = Class.forName("com.nk.day06.User"); 5 System.out.println(c1); 6 7 Class c2 = Class.forName("com.nk.day06.User"); 8 Class c3 = Class.forName("com.nk.day06.User"); 9 //一个类在内存中只有一个Class对象 10 //一个类被加载后,类的整个结构都会被封装在Class对象中 11 System.out.println(c2.hashCode()); 12 System.out.println(c3.hashCode()); 13 } 14 } 15 16 class User{ 17 private String name; 18 private int age; 19 20 public User() { 21 } 22 23 public User(String name, int age) { 24 this.name = name; 25 this.age = age; 26 } 27 28 public String getName() { 29 return name; 30 } 31 32 public void setName(String name) { 33 this.name = name; 34 } 35 36 public int getAge() { 37 return age; 38 } 39 40 public void setAge(int age) { 41 this.age = age; 42 } 43 44 @Override 45 public String toString() { 46 return "User{" + 47 "name='" + name + '\'' + 48 ", age=" + age + 49 '}'; 50 } 51 }