标签:
反射机制
课程大纲
一、 什么是反射
1、 反射:Reflection:类信息->对象,对象->类信息
2、 由对象得到类信息就叫反射。
二、 Class类
1、 Class类是一切的反射根源
2、 Class类表示什么?
3、 很多车——可以定义一个Car类(发动机,颜色)
4、 很多人——可以定义一个Person类(姓名,年龄)
5、 很多类——Class类(类名,属性,方法)
6、 得到Class类的对象有三种方法
(1)、Object类中的getClass()方法
(2)、类.class
(3)、通过Class类的forName()方法
7、使用Class类进行对象的实例化操作
(1)、调用无参构造进行实例化:
Public T newInstance() throws InstantiationException
(2)、调用有参构造进行实例化
public Constructor
一:类信息
package com.ref;
public class Person {
private String name;
private int age;
private char sex;
//私有方法
private void say(){
System.out.println("my name is :" + name);
}
public Person() {
super();
// TODO Auto-generated constructor stub
System.out.println("无惨构造方法");
}
public Person(String name, int age, char sex) {
super();
this.name = name;
this.age = age;
this.sex = sex;
System.out.println("带参构造方法");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public char getSex() {
return sex;
}
public void setSex(char sex) {
this.sex = sex;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", sex=" + sex + "]";
}
}
二、测试信息
package com.ref;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
/**
* 反射的例子:只要我能得到你对象,我什么事都能做出来(包括:调用无参构造方法,有参构造方法,所有的构造方法名称,
* 构造方法参数类型,包名,类名,所有的方法名称,方法的修饰符,属性名称,调用私有的方法和属性等所有的东西都能搞出来)
* @author Administrator
*
*/
public class ReflectionDemo {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
Person p1 = new Person("小白", 18,‘男‘);
Person p2 = new Person("小黑", 19,‘女‘);
//一个Class对象代表着一份字节码,相同类型的对象得到的字节码对象是同一个
//创建Class对象的方法一:
Class personClass1 = p1.getClass();//这里会调用带参构造方法
Class personClass2 = p2.getClass();//这里会调用带参构造方法
System.out.println(personClass1 == personClass2);
//创建Class对象的方式二:
Class personClass3 = Person.class;
System.out.println(personClass1 == personClass3);
//创建Class对象的方式三:传入的参数是类名的完整路径
Class personClass4 = Class.forName("com.ref.Person");
System.out.println(personClass1 == personClass4);
//—————————————————通过类信息实例化对象—————————————————————————
//调用无惨构造方法
//调用此方法时要注意,如果类中没有无参构造方法,将会报InstantiationException
Person p3 = (Person) personClass4.newInstance();//这里会调用无惨构造方法
System.out.println(p3);
//调用有参构造方法
//获取当前类的所有构造方法
Constructor[] cs = personClass4.getConstructors();
for (Constructor c : cs) {
System.out.println(c.getName());//遍历输出所有构造方法的名称
Class[] parameterTypes = c.getParameterTypes();
for (Class class1 : parameterTypes) {
System.out.println(class1);//遍历输出所有的参数类型
}
System.out.println("------------------------------------");
}
//获取指定参数类型的构造方法
//在上面已经遍历输出了所有的类型参数类型(所以这里的参数可以直接根据上面的输出写入)
Constructor c1 = personClass4.getConstructor(String.class,int.class,char.class);
Person p4 = (Person) c1.newInstance("小花",10,‘女‘);//调动有参构造方法
System.out.println(p4);
System.out.println("---------------获得类信息--------------------------");
System.out.println("包信息:" + personClass4.getPackage().getName());
System.out.println("类名:" + personClass4.getName());
//获取方法信息
System.out.println("获取方法信息");
//返回一个包含某些Method对象的数组,这次对象反应此class对象所表示的类
//或者接口(包括那些由该类或接口声明的以及从超类或者超类接口继承的那些的类或者接口)的公共member方法。
//返回该类和父类里面所有的公共的方法
Method[] methods = personClass4.getMethods();
for (int i = 0; i < methods.length; i++) {
Method m = methods[i];
System.out.println("方法名为:" + m.getName());
}
System.out.println("---------------------------------------------");
//返回Method对象的一个数组,这些对象反应此Class对象表示的类或者接口声明的所有方法,
//包括公共,保护,默认(包),访问和私有方法,但不包括继承的方法。
//返回本类里面所有的方法,包括私有的,但是不包括父类里面的
Method[] methods2 = personClass4.getDeclaredMethods();
for (int i = 0; i < methods2.length; i++) {
Method method = methods2[i];
System.out.println("方法名:" + Modifier.toString(method.getModifiers()) + " " + method.getName());
}
System.out.println("-----------获取属性信息---------------------");
//返回一个包含某些Field对象的数组,这些对象反应此Class对象所表示的类或者接口的所有可访问公共字段
Field[] fields = personClass4.getFields();
System.out.println("数组长度为:" + fields.length);//此时为0,因为获取的是公共的,这里没有公共的所以为0
for (int i = 0; i < fields.length; i++) {
System.out.println(fields[i].getName());
}
System.out.println("------------------------------------------------");
Field[] fields2 = personClass4.getDeclaredFields();
for (int i = 0; i < fields2.length; i++) {
System.out.println("属性名称为:" + fields2[i].getName());
}
System.out.println("-------------调用方法和属性-------------------------");
System.out.println("--------调用方法-------------");
//得到要调用的方法名称:
Method setNameMethod = personClass4.getMethod("setName", String.class);
//调动方法
setNameMethod.invoke(p4, "花花");//相当于p4.setName("花花")(一个对象名,一个参数)
System.out.println(p4);
//调用私有方法
Method sayMethod = personClass4.getDeclaredMethod("say");
sayMethod.setAccessible(true);//让其可以调用私有方法
sayMethod.invoke(p4);
System.out.println("--------------------调用属性-----------------------");
Field ageField = personClass4.getDeclaredField("age");
ageField.setAccessible(true);
System.out.println(ageField.get(p4));//调用p4的age值
ageField.set(p4, 18);
System.out.println(p4);
}
}
标签:
原文地址:http://blog.csdn.net/u014756517/article/details/51993314