什么是反射?
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
Java反射机制主要提供的功能?
在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
类的加载:
java反射机制是围绕Class类展开的,在深入java反射原理之前,需要对类加载机制有一个大致的了解。jvm使用ClassLoader将字节码文件(class文件)加载到方法区内存中:
Class clazz = ClassLoader.getSystemClassLoader().loadClass(“com.mypackage.MyClass”);
可见ClassLoader根据类的完全限定名加载类并返回了一个Class对象,而java反射的所有起源都是从这个class类开始的。
类对象:
每一个类都有一个class对象,(编写并且编译一个新类的时候就会产生一个class对象,被保存在.class文件里面),由JVM的类加载器负责生成,当创建第一个类的成员引用的时候,就会加载这个类(这说明构造方法也是静态的),java程序在它开始运行之前并非被完全加载,其每个部分只有在需要的时候才会被加载(动态加载)。类加载器首先检查Class对象是否被加载进内存,如果没有,那么默认的类加载器就会根据类名查找.class文件,在这个类的字节码被加载的时候,还会进行验证。
获取Class对象的三种方式:
1 Object ——> getClass();
2 任何数据类型(包括基本数据类型)都有一个“静态”的class属性
3 通过Class类的静态方法:forName(String className)(常用)
例子:
public class test {
public static void main(String[] args)
throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException,
IllegalAccessException, IllegalArgumentException, InvocationTargetException, NoSuchFieldException {
Class userclass = Class.forName("Test.FansheUser");// 获得class对象的三种方法(一定要是正确的路径)获取class对象的引用
/*
* Fansheuserclass userclass=new Fansheuserclass(); Class userclass =
* userclass.getClass(); Class userclass = Fansheuserclass.class;
*/
System.out.println(userclass.getName());
// Constructor[] c = userclass.getConstructors();// 获取所有公有构造方法
// Constructor[] c1 = userclass.getDeclaredConstructors();// 获取所有构造方法
userclass.newInstance();//返回确切的类型
Constructor o = userclass.getConstructor(null);// 获取无参构造
// Constructor c2 = userclass.getDeclaredConstructor(char.class);//
// 获取私有构造方法(参数是char类型的)
o.setAccessible(true);// 暴力访问(忽略访问修饰符)
FansheUser u = (FansheUser) o.newInstance();// 用构造方法来构造新的实例(如果是有参构造可以传入参数)
u.getName("");
// Field[] f = userclass.getFields();// 获取所有的公有字段
// Field[] f1 = userclass.getDeclaredFields();// 获取所有的字段
// Field f2 = userclass.getDeclaredField("name");// 获取字段name
Field f3 = userclass.getDeclaredField("name");// 获取公有字段name
f3.setAccessible(true);// 解除限制,暴力设置
f3.set(u, "刘德华");// 为object设置属性(需要object对象)
System.out.println(f3.get(u));
// Method[] m = userclass.getMethods();// 获取公有方法
// Method[] m1 = userclass.getDeclaredMethods();// 获取所有方法
Method m2 = userclass.getMethod("getName", String.class);// 获取指定的公有方法
// Method m3 = userclass.getDeclaredMethod("getName", String.class);//
// 获取指定的所有方法(private,public,default)
m2.setAccessible(true);
m2.invoke(u, "i am userclass");// 参数(实例,参数)
}
}
interface user {
abstract void getName(String s);
}
class FansheUser implements user {
private String name = "tom";
public FansheUser() {
super();
// TODO Auto-generated constructor stub
}
@Override
public void getName(String s) {
// TODO Auto-generated method stub
System.out.println(name + ":" + s);
}
}