java反射-重点内容
一,反射机制作用:
- 可以操作字节码文件,使程序更加灵活
二,反射机制常用类:
- java.lang.Class:代表整个字节码,代表一个类型,代表整个类。
- java.lang.reflect.Method:代表字节码中的方法字节码。代表类中的方法。
- java.lang.reflect.Constructor:代表字节码中的构造方法字节码。代表类中的构造方法
- java.lang.reflect.Field:代表字节码中的属性字节码。代表类中的成员变量(静态变量+实例变量)
三,获取javaClass实例的方式:
- Class c = Class.forName("完整类名带包名")
- Class c = 对象.getClass()
- Class c = 任何类型.class
四,反射机制的具体功能:
public class User{
public String name;
private int password;
public User() {
}
public User(String name, int password) {
this.name = name;
this.password = password;
}
public boolean login(String name, int password){
return "admin".equals(name) && password == 123456;
}
}
1.通过反射机制访问对象的某个属性
public class Reflect01 {
public static void main(String[] args) throws Exception {
//使用反射机制获取一个类的Class实例
Class<?> userClass = Class.forName("com.lv.reflect.User");
//通过这个类的Class创建类的实例化对象,底层调用了无参数构造方法,obj就是User对象
Object obj = userClass.newInstance();
//访问公有属性
//根据属性名来获取属性的Field实例
Field name = userClass.getDeclaredField("name");
//给obj对象的name属性赋值为张三
name.set(obj,"admin");
//获取obj的那么属性值并输出
System.out.println(name.get(obj));
//访问私有属性
Field age = userClass.getDeclaredField("password");
//需要增加一步打破封装,这样设置后,在外部也可以访问private的,可能给不法分子留下机会
age.setAccessible(true);
age.set(obj,123456);
System.out.println(age.get(obj));
}
}
2.通过反射机制调用对象的某个方法
public class Reflect02 {
public static void main(String[] args) throws Exception {
//使用反射机制获取一个类的Class实例
Class<?> userClass = Class.forName("com.lv.reflect.User");
//通过这个类的Class创建类的实例化对象,底层调用了无参数构造方法,obj就是User对象
Object obj = userClass.newInstance();
//通过方法名获取这个方法的Method实例
Method login = userClass.getMethod("login", String.class, int.class);
//执行obj对象的login方法,并传入参数,获取返回结果
Object result = login.invoke(obj, "admin", 123456);
System.out.println((boolean)result?"登录成功":"登录失败");
}
}
3.通过反射机制调用某个构造方法实例化对象
public class Reflect03 {
public static void main(String[] args) throws Exception{
//使用反射机制获取一个类的Class实例
Class<?> userClass = Class.forName("com.lv.reflect.User");
//通过这个类的Class创建类的实例化对象,底层调用了无参数构造方法,obj就是User对象
Object obj = userClass.newInstance();
//获取有参数的构造方法
Constructor<?> con = userClass.getDeclaredConstructor(String.class, int.class);
//用构造方法创建实例对象
Object o1 = con.newInstance("admin", 123456);
System.out.println(o1);
//获取无参数的构造方法
Constructor<?> con2 = userClass.getConstructor();
Object o2 = con2.newInstance();
System.out.println(o2);
}
}
4.通过反射机制获取父类以及父类型接口
public class Reflect04 {
public static void main(String[] args) throws Exception{
// 获取String类的Class实例
Class<?> stringClass = Class.forName("java.lang.String");
// 通过Class实例获取String的父类
Class<?> superClass = stringClass.getSuperclass();
System.out.println(superClass.getName());
// 通过Class实例获取String类实现的所有接口(一个类实现的接口可以有多个)
Class<?>[] interfaces = stringClass.getInterfaces();
for(Class<?> in : interfaces){
System.out.println(in.getName());
}
}
}