----------- android培训、java培训、期待与您交流! ------------
一个类有多个组成部分,例如:成员变量,方法,构造方法等。反射就是加载类,并解剖出各个组成部分。(反射技术用于框架中)
1) 加载类,获得类的字节码。
(1) Classclass = Class.forName(“person”);
(2) Class class1 = new Person.getClass();
(3) Classclass2 = Person.class;
2) 反射类的构造函数,创建类的对象。
public class Person {
public String name = "zhangsan";
public Person(){
System.out.println("person");
}
public Person(String name){
System.out.println("person name");
}
public Person(String name, int password){
System.out.println("person name password");
}
private Person(List list){
System.out.println("list");
}
//-----类的方法------
public void show(){
System.out.println("show");
}
public void show(String name, int password){
System.out.println(name+":"+password);
}
public Class[] show(String name, int[] password){
return new Class[] {String.class};
}
private void show(InputStream in){
System.out.println(in);
}
public static void show(int num){
System.out.println(num);
}
}
public class Demo1 {
// 反射无参构造函数 (以下都在JUnite下执行)
@Test
public void test1() throws Exception {
Class clazz = Class.forName("com.java.enhance.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.java.enhance.Person");
Constructor c = clazz.getConstructor(String.class);
Person p = (Person) c.newInstance("heima");
System.out.println(p.name);
}
// 反射多参构造函数
@Test
public void test3() throws Exception {
Class clazz = Class.forName("com.java.enhance.Person");
Constructor c = clazz.getConstructor(String.class, int.class);
Person p = (Person) c.newInstance("heima", 20);
System.out.println(p.name);
}
// 反射私有构造函数
@Test
public void test4() throws Exception {
Class clazz = Class.forName("com.java.enhance.Person");
Constructor c = clazz.getDeclaredConstructor(List.class);
c.setAccessible(true); // 由于构造方法私有不能访问,暴力反射
Person p = (Person) c.newInstance(new ArrayList());
System.out.println(p.name);
}
}
3)反射类的方法
a.Method类代表某个类中的一个成员方法
b. 得到类中的某一个方法
例: Method charAt = Class.forName("java.lang.String").getMethod("charAt".int.class);
c.调用方法
通常方式::System.out.println(str.charAt(1));
反射方式:System.out.println(charAt.invoke(str,1));
注意:如果传递给Method对象的invoke()方法的第一个参数为null,则说明该Method对象对应的是一个静态方法。
public class PersonDemo2 {
@Test
public void test1() throws Exception {
Person p = new Person();
Class clazz = Class.forName("com.java.enhance.Person"); //加载类
Method method = clazz.getMethod("show", null); // 得到类中的某一个方法
method.invoke(p, null); //调用方法
}
// 反射的方法:public void show(String name, int password)
@Test
public void test2() throws Exception {
Person p = new Person();
Class clazz = Class.forName("com.java.enhance.Person");
Method method = clazz.getMethod("show", String.class, int.class);
method.invoke(p, "zxx", 36);
}
// 反射的方法:public Class[] show(String name,int[] password)
@Test
public void test3() throws Exception {
Person p = new Person();
Class clazz = Class.forName("com.java.enhance.Person");
Method method = clazz.getMethod("show", String.class, int[].class);
Class cs[] = (Class[]) method.invoke(p, "xyz", new int[] { 1, 2, 3 });
System.out.println(cs[0]);
}
// 反射类静态的方法,传递给Method对象的invoke()方法的第一个参数为null
@Test
public void test5() throws Exception {
Class clazz = Class.forName("com.java.enhance.Person");
Method method = clazz.getMethod("show", int.class);
method.invoke(null, 12);
}
}
4)反射类的字段
Field类代表某个类中的一个成员变量
@Test
public void test1() throws Exception {
Person p = new Person();
Class clazz = Class.forName("com.java.enhance.Person");
Field f = clazz.getField("name");
Object value = f.get(p); // String name = (String)f.get(p);
// 获取字段的类型
Class type = f.getType();
if (type.equals(String.class)) {
String svalue = (String) value;
System.out.println(svalue);
}
// 设置字段的值
f.set(p, "yyyy");
System.out.println(p.name);
}
----------------------- android培训、java培训、java学习型技术博客、期待与您交流! ----------------------