Java基础笔记32-反射
- 介绍
- 反射是Java中一个非常重要的高级特性,基本上Spring等一系列框架都是基于反射的思想写成的。
- Java反射机制是在程序运行过程中对于任何一个类,都能知道它的所有属性和方法,对于任意一个对象,都能喝知道调用它的任意属性和方法,这种动态获取信息以及鼎泰调用对象方法的功能称为Java语言的反射机制。
- 利用反射机制可以在运行时判断任意一个对象所属的类,可以构造任意一个类的对象,可以判断任意一个类的成员属性和方法,可以调用任意一个对象的方法。
- Java文件编译后生成的class文件(字节码文件)是唯一的,所有的对象都是通过class来创建,Class本身也是一个类型,类型就是Class,另外,所有的引用数据类型都具备一个class属性,所有的对象都有一个getClass()方法,对于基本数据类型也都有一个class属性(int.class)
- Class类中包含的就是该类的所有属性及方法、类及类签名等信息
- 常用的类
- Class 用于获取类信息
- Method 用于获取方法信息
- Field 用于获取属性信息
- constructor 用于获取构造器信息
代码示例:
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class ReflexDemo {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, SecurityException {
reflexMethod4();
}
/**
* 获取.class文件中的 方法
* @throws ClassNotFoundException
* @throws SecurityException
* @throws NoSuchMethodException
*/
public static void reflexMethod4() throws ClassNotFoundException, NoSuchMethodException, SecurityException {
Class itemCls = Class.forName("cn.yunhe.reflex.Item");
//获取全部公共方法,包括继承的
//Method[] method1 = itemCls.getMethods();
//获取此类的全部公共方法,但不包括继承的
// Method[] method2 = itemCls.getDeclaredMethods();
//
// for(int i=0;i<method2.length;i++) {
// System.out.println(method2[i]);
// }
//获取指定方法名的方法,需要指定方法名及参数类型,无参数,类型可不写会写null
Method method3 = itemCls.getMethod("setName", String.class);
Method method4 = itemCls.getMethod("getName",null);
System.out.println(method3);
System.out.println(method4);
}
/**
* 在只有.class文件的情况下获取此类的构造器信息
* 通常情况下在使用第三方的jar包时,能知道的仅仅是通过build path添加到功能的class文件的路径及名称
*
* 包名+文件名
* 使用Class类中提供的方法:forName(String path)
*
* @throws ClassNotFoundException
* @throws NoSuchMethodException
* @throws SecurityException
*/
public static void reflexMethod3() throws ClassNotFoundException, NoSuchMethodException, SecurityException {
Class itemCls = Class.forName("cn.yunhe.reflex.Item");
//获取所有公共的构造器
Constructor[] cons1 = itemCls.getConstructors();
System.out.println(cons1[0]);
//获取所有的构造器包括私有的
Constructor[] cons2 = itemCls.getDeclaredConstructors();
for(int i=0;i<cons2.length;i++) {
System.out.println(cons2[i]);
System.out.println(cons2[i].getParameterCount());
}
}
/**
* 每个类都有.class属性
*/
public static void reflexMethod2() {
Class cls1 = User.class;
Class cls2 = User.class;
System.out.println(cls1 == cls2);//true
Class cls3 = int.class;
Class cls4 = Integer.class;
System.out.println(cls3 == cls4);//false
}
/**
* 返回Class对象的方式一:getclass()
* 每一个引用数据类型都有一个getClass()方法,返回的就是该类的class对象
*/
public static void reflexMethod1() {
User user =new User();
Class cls = user.getClass();
System.out.println(cls);//class cn.yunhe.reflex.User
User user2 = new User();
Class cls2 = user2.getClass();
System.out.println(cls2);//class cn.yunhe.reflex.User
System.out.println(cls == cls2);//true
}
}
class User{
private String name;
private int age;
public User() {}
public User(String name, int age) {
super();
this.name = name;
this.age = age;
}
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;
}
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + "]";
}
}