反射
===
定义:
* 反射就是加载类,并解剖出类德各个组成部分
* 反射可以实现访问私有成员(private)
* 反射机制允许在运行时发现折使用类的信息
Class对象
===
每个类都会产生一个对应的Class对象,也就是保存在.class文件,所有类都是在对其第一个使用时,动态加载到JVM的,当程序创建一个对类的静态成员的引用时,就会加载这个类。Class对象仅在需要的时候才会加载,static初始化是在类加载时进行的。
反射步骤:
===
* 加载:由类加载器完成,找到对应的字节码,创建一个Class对象
* 链接:验证类中的字节码,为静态域分配空间
* 初始化:如果该类有超类,则对其初始化,执行静态初始化器和静态初始化块
代码实例:(反射类的构造方法)
===
```
public class Demo2 {
@Test
public void test1() throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException
{
Class clazz = Class.forName("com.amrom.reflect.Person");
Constructor c = clazz.getConstructor(null);
Person p = (Person) c.newInstance(null);
System.out.println(p.name);
}
@Test
public void test2() throws Exception {
Class clazz =Class.forName("com.amrom.reflect.Person");
Constructor c = clazz.getConstructor(String.class);
Person p = (Person) c.newInstance("linjinbao");
System.out.println(p.name);
}
@Test
public void test3() throws Exception
{
Class clazz = Class.forName("com.amrom.reflect.Person");
Constructor c = clazz.getConstructor(String.class, int.class);
Person p = (Person) c.newInstance("linjinbao", 19);
System.out.println(p.name);
}
@Test
public void test4() throws Exception {
Class clazz = Class.forName("com.amrom.reflect.Person");
Constructor c= clazz.getDeclaredConstructor(int.class);
c.setAccessible(true);//暴力反射
Person p = (Person) c.newInstance(19);
System.out.println(p.name);
}
}
```
代码实例:(反射类的方法)
===
```
public void test4() throws Exception {
Class clazz = Class.forName("com.amrom.reflect.Person");
Constructor c= clazz.getDeclaredConstructor(int.class);
Method m = clazz.getMethod("setName", String.class);
System.out.println(m);
c.setAccessible(true);//暴力反射
Person p = (Person) c.newInstance(19);
m.invoke(p, "zhizhang");//方法
System.out.println(p.name);
}
```
main()方法的反射:
===
```
public class Demo3 {
@Test
public void test() throws Exception {
Class clazz = Class.forName("com.amrom.reflect.Person");
Method m = clazz.getMethod("main", String[].class);
m.invoke(null, new Object[]{new String[]{"a"}});
}
}
```
```
public class Demo3 {
@Test
public void test() throws Exception {
Class clazz = Class.forName("com.amrom.reflect.Person");
Method m = clazz.getMethod("main", String[].class);
m.invoke(null, (Object)new String[]{"a"});
}
}
```
反射类的字段
===
```
public class Demo4 {
@Test
public void test() throws Exception {
Person p = new Person();
Class clazz = Class.forName("com.amrom.reflect.Person");
Field f = clazz.getField("name");
String name = (String) f.get(p);
System.out.println(name);
System.out.println(f.getType());
}
}
```