1、反射:动态获取类的信息,以及动态调用对象的方法的功能。可以理解为动态看透类的能力。
2、主要功能:在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。通过java反射机制,可以在程序中访问已经装载到JVM中的java对象的描述,实现访问、检测和修改描述java对象本身信息的功能。java反射机制的功能十分强大,java.lang.reflect包中提供了对该功能的支持。
//1、第一种方式-->Class.forName("类名字符串");
//注:类名字符串是"包名+类名" 返回Class的对象。(这种是最常用的方法)
Class c1=Class.forName("csdn.Student");
//2、第二种方式-->先创建对象,再用对象调用getClass()方法,即实例对象.getClass().返回运行时类。
//任何一个java对象都有getClass()方法
Student s=new Student();
Class c2 = s.getClass();
//3、第三种方式-->类名.class。返回Class的对象。(每个类都有class属性)
Class c3=Student.class;
package csdn;
public class Person {
public String name;// 姓名
public int age;// 年龄
public Person() {
super();
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String showInfo() {
return "name=" + name + ", age=" + age;
}
}
package csdn;
public class Student extends Person implements Study {
public String className;// 班级
private String address;// 住址
public Student() {
super();
}
public Student(String name, int age, String className, String address) {
super(name, age);
this.className = className;
this.address = address;
}
public Student(String className) {
this.className = className;
}
public String toString() {
return "姓名:" + name + ",年龄:" + age + ",班级:" + className + ",住址:"
+ address;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
package csdn;
public interface Study {
//仅为了演示获得接口,就没有写抽象方法
}
1、获得属性:
Class stu = Class.forName("csdn.Student");
// 获取对象的所有公有属性。
Field[] fields = stu.getFields();
for (Field f : fields) {
System.out.println(f);
}
System.out.println("---------------------");
// 获取对象所有属性,但不包含继承的。
Field[] declaredFields = stu.getDeclaredFields();
for (Field ff : declaredFields) {
System.out.println(ff);
}
运行结果:
Class stu = Class.forName("csdn.Student");
// 获取对象的所有公共方法
Method[] methods = stu.getMethods();
for (Method m : methods) {
System.out.println(m);
}
System.out.println("---------------------");
// 获取对象所有方法,但不包含继承的
Method[] declaredMethods = stu.getDeclaredMethods();
for (Method ms : declaredMethods) {
System.out.println(ms);
}
运行结果:
Class stu = Class.forName("csdn.Student");
// 获取对象所有的公共构造方法
Constructor[] constructors = stu.getConstructors();
for (Constructor c : constructors) {
System.out.println(c);
}
System.out.println("---------------------");
// 获取对象所有的构造方法
Constructor[] declaredConstructors = stu.getDeclaredConstructors();
for (Constructor con : declaredConstructors) {
System.out.println(con);
}
运行结果为:
Class stu = Class.forName("csdn.Student");
System.out.println(stu.getName());//获取对象全限定名称
System.out.println(stu.getPackage());// 获取包名
Class[] interfaces = stu.getInterfaces();//获取该类实现的所有接口
for(Class in:interfaces){
System.out.println(in);
}
运行结果为:
package csdn;
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class TestReflect {
@SuppressWarnings("unchecked")
public static void main(String[] args) {
try {
Class c = Class.forName("csdn.Student");
Student stu = (Student) c.newInstance();
// 第一种方法,实例化默认构造方法,调用set赋值
stu.setAddress("深圳南山");
System.out.println(stu);
// 第二种方法 取得全部的构造函数 使用构造函数赋值
Constructor constructor = c.getConstructor(String.class,
int.class, String.class, String.class);
Student s = (Student) constructor.newInstance("李四", 18, "七班", "深圳");
System.out.println(s);
Method show = c.getMethod("showInfo");//获取showInfo()方法
System.out.println(show.invoke(s));//调用showInfo()方法
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行结果为: