反射就是把Java类中的各种成分映射成相应的Java类
反射的基本步骤:
1、获得Class对象,就是获取到指定的名称的字节码文件对象。
2、实例化对象,获得类的属性、方法或构造函数。
3、访问属性、调用方法、调用构造函数创建对象。
被反射的Person类
<span style="font-size:24px;">package cn.itcast.reflect;
import java.io.InputStream;
import java.util.List;
public class Person {
public String name = "aaaaa";
private int password;
private static int age = 23;
// ------------------------------------反射以下构造方法
public Person() {
System.out.println("person");
}
public Person(String name) {
System.out.println(name);
}
public Person(String name, int password) {
System.out.println(name + ":" + password);
}
private Person(List list) {
System.out.println("list");
}
// ------------------------------------反射以下方法
public void aa1() {
System.out.println("aa1");
}
public void aa1(String name, int password) {
System.out.println("name= " + name + " password=" + password);
}
public Class[] aa1(String name, int[] password) {
return new Class[] { String.class };
}
private void aa1(InputStream in) {
System.out.println(in);
}
public static void aa1(int num) {
System.out.println(num);
}
// ------------------------------------反射main方法
public static void main(String[] args) {
System.out.println("main!!!!");
}
}
</span>
加载类的字节码文件的3种方法
<span style="font-size:24px;">package cn.itcast.reflect;
public class Demo1 {
/**
* 加载类的字节码
*/
public static void main(String[] args) throws Exception {
// 1.
Class clazz1 = Class.forName("cn.itcast.reflect.Person");
// 2
Class clazz2 = Person.class;
// 3
Class clazz3 = new Person().getClass();
//(被反射的类,必须有无参的构造函数)
Person p = (Person) clazz1.newInstance();
}
}
</span>
反射类的构造函数
<span style="font-size:24px;">package cn.itcast.reflect;
import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.List;
import org.junit.Test;
public class Demo2 {
// public Person()
@Test
public void test1() throws Exception {
// 加载.class类文件到内存中
Class clazz = Class.forName("cn.itcast.reflect.Person");
Constructor c = clazz.getConstructor(null);
Person p = (Person) c.newInstance(null);// person
System.out.println(p.name);// aaaa
}
// public Person(String name)
@Test
public void test2() throws Exception {
Class clazz = Class.forName("cn.itcast.reflect.Person");
Constructor c = clazz.getConstructor(String.class);
Person p = (Person) c.newInstance("abc");// person name
System.out.println(p.name);// aaaaa
}
// public Person(String name,int password)
@Test
public void test3() throws Exception {
Class clazz = Class.forName("cn.itcast.reflect.Person");
Constructor c = clazz.getConstructor(String.class, int.class);
Person p = (Person) c.newInstance("abc", 999);// abc:999
System.out.println(p.name);// aaaaa
}
// private Person(List list)
@Test
public void test4() throws Exception {
Class clazz = Class.forName("cn.itcast.reflect.Person");
Constructor c = clazz.getDeclaredConstructor(List.class);
c.setAccessible(true);// 暴力反射,统统打开访问权限
Person p = (Person) c.newInstance(new ArrayList());// list
System.out.println(p.name);// aaaa
}
// 创建对象的另外一种途径,无参构造方法,等效test1
@Test
public void test5() throws ClassNotFoundException, InstantiationException,
IllegalAccessException {
Class clazz = Class.forName("cn.itcast.reflect.Person");
Person p = (Person) clazz.newInstance();
System.out.println(p);
}
}
</span>
反射类的方法,main方法
<span style="font-size:24px;">package cn.itcast.reflect;
import java.io.FileInputStream;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.Arrays;
import org.junit.Test;
//反射类的方法
public class Demo3 {
// 反射类的方法: public void aa1()
@Test
public void test1() throws Exception {
Class clazz = Class.forName("cn.itcast.reflect.Person");
Method method = clazz.getMethod("aa1", null);// 第一个参数是被反射方法的名字,第二个参数是被反射方法的参数。
Person p = new Person();// person
method.invoke(p, null);// 第一个参数:调用谁的对象的方法;第2个参数:方法所传递的参数
}
// public void aa1(String name,int password)
@Test
public void test2() throws Exception {
Class clazz = Class.forName("cn.itcast.reflect.Person");
Method method = clazz.getMethod("aa1", String.class, int.class);// 第一个参数是被反射方法的函数名,第二个参数是被反射方法的参数。
Person p = new Person();// person
method.invoke(p, "xxxx", 99);// name= xxxx password=99
}
// public Class[] aa1(String name,int[] password)
@Test
public void test3() throws Exception {
Class clazz = Class.forName("cn.itcast.reflect.Person");
Method method = clazz.getMethod("aa1", String.class, int[].class);
Person p = new Person();// person
Class cs[] = (Class[]) method.invoke(p, "xxxx", new int[] { 1, 2, 3 });// name=
// xxxx
// password=99
System.out.println(cs[0]);// class java.lang.String
}
// private void aa1(InputStream in)
@Test
public void test4() throws Exception {
Class clazz = Class.forName("cn.itcast.reflect.Person");
Method method = clazz.getDeclaredMethod("aa1", InputStream.class);
method.setAccessible(true);
Person p = new Person();// person
method.invoke(p, new FileInputStream("C:\\1.txt"));//
}
// public static void aa1(int num)
@Test
public void test5() throws Exception {
Class clazz = Class.forName("cn.itcast.reflect.Person");
Method method = clazz.getMethod("aa1", int.class);
method.invoke(null, 777);// 777 静态方法调用不需要对象,给对象也行
}
// public static void main(String []args){}//重点
@Test
public void test6() throws Exception {
Class clazz = Class.forName("cn.itcast.reflect.Person");
Method method = clazz.getMethod("main", String[].class);
// method.invoke(null,new String[]{"a","c"});//Wrong
// method.invoke(null,"a","c");//Wrong
String[] str = { "x", "y", "z" };
method.invoke(null, (Object) str);
method.invoke(null, new Object[] { new String[] { "a", "c" } });
method.invoke(null, (Object) new String[] { "a", "c" });
}
}
</span>
反射类的字段
<span style="font-size:24px;">package cn.itcast.reflect;
import org.junit.Test;
import java.lang.reflect.Field;
//反射类的字段
public class Demo4 {
// public String name="aaaa";
@Test
public void test1() throws Exception {
Class clazz = Class.forName("cn.itcast.reflect.Person");
Field f = clazz.getField("name");
Person p = new Person();
Object value = f.get(p);// 获取字段值
Class type = f.getType();// 字段类型
System.out.println(type);// class java.lang.String
if (type.equals(String.class)) {
String S_value = (String) value;
System.out.println(S_value);// aaaa
}
// 设置值
f.set(p, "XXXXXXXXXXXX");
System.out.println(p.name);// XXXXXXXXXXXX
}
// private int password;
@Test
public void test2() throws Exception {
Class clazz = Class.forName("cn.itcast.reflect.Person");
Field f = clazz.getDeclaredField("password");
f.setAccessible(true);
Person p = new Person();
f.set(p, 123);
System.out.println(f.get(p));// 123
}
// private static int age=23;
@Test
public void test3() throws Exception {
Class clazz = Class.forName("cn.itcast.reflect.Person");
Field f = clazz.getDeclaredField("age");
f.setAccessible(true);
System.out.println(f.get(null));// 23
}
}
</span>