java反射机制实例
程序员文章站
2022-05-28 09:40:30
...
对于java反射机制,我先说java反射机制的功能,后以代码演示给大家!
1.功能
java反射:问过许多同学,让他们用通俗易懂的话说给我听,但没有结果,晚上和老王(一同学)聊天,才对java反射有了更深的认识。反射的反面就是“正射”(为了理解,杜撰的啊,还望大家理解),想信大家对多态不会陌生,通过多态我们可以引用子类的对象,但我们却无法获得父类的非静态方法的使用,通过java反射机制我们就可以做到这一点。通过一个实例,我们可以获知相应的类,也可以获知类中含有的所有属性、构造函数和方法,还可以获知该类所继承的抽象类和所有的接口,更为强大的功能是我们可以通过子类可以访问父类的私有属性和方法。但试验过,好像不能访问父类的私有构造函数(这一点不确定,查阅资料无果,若大家有想法,请多赐教),完全打破了面向对象的封装特点,让我神经很大很疯狂!
2。代码示例
package com.ibm.etp.refl;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class TestPerson {
/**
* @param args
* @throws ClassNotFoundException
*/
public static void main(String[] args) throws ClassNotFoundException {
Person person = new Person("hero", "java reflection");
// all interfaces of person instance
getInterfaceByObj(person);
// get superclass of person instance
getSuperclassByObj(person);
// get all methods of person instance
getMethodsByObj(person);
// get method by specified name
getMethodByObj(person);
// get all fields of person instance
getFieldsByObj(person);
// 调用父类私有的方法
invokePrivateMethod(person);
// 调用父类私有的属性
invokePrivateField(person);
// 尝试调用父类私有的构造函数,但不能成功,所以我认为不可以调用私有的构造函数
invokePrivateConstractor(person);
}
// I am used to put '[]' after Object rather not instance,for enhanced for
// statement
public static void getInterfaceByObj(Person person) {
// 根据对象获得类
Class<?> cls = person.getClass();
// 根据类获得所有派生此类的接口
Class<?>[] interfaces = cls.getInterfaces();
System.out.println(interfaces[0]);
}
public static void getSuperclassByObj(Person person) {
Class<?> cls = person.getClass();
// 获得父类
Class<?> superclass = cls.getSuperclass();
System.out.println(superclass);
}
public final static void getConstractorsByObject(Person person) {
Class<?> cls = person.getClass();
// 获得类中所有构造函数
Constructor<?>[] constructors = cls.getConstructors();
for (Constructor<?> c : constructors) {
System.out.println(c);
}
}
public final static void getMethodsByObj(Person person) {
Class<?> cls = person.getClass();
// 获得类中所有的函数
Method[] methods = cls.getMethods();
for (Method method : methods) {
System.out.println(method);
}
}
public final static void getMethodByObj(Person person) {
Class<?> cls = person.getClass();
// 获得特定的函数
try {
Method method = cls.getMethod("relax", String.class);
method.invoke(cls.newInstance(), "play tennies");
} catch (Exception ex) {
ex.printStackTrace();
}
}
public final static void getFieldsByObj(Person person) {
Class<?> cls = person.getClass();
// 获得类中所有的属性
Field[] fields = cls.getDeclaredFields();
for (Field field : fields) {
System.out.println(field);
}
}
public final static void invokePrivateMethod(Person person) {
Class<?> cls = person.getClass();
Class<?> superClass = cls.getSuperclass();
// 获得父类中私有方法的使用权
try {
Method running = superClass.getDeclaredMethod("running",
new Class[] { String.class });
running.setAccessible(true);
running.invoke(person, new Object[] { "summer" });
} catch (Exception ex) {
ex.printStackTrace();
}
}
public final static void invokePrivateField(Person person) {
Class<?> cls = person.getClass();
Class<?> superClass = cls.getSuperclass();
// 获得父类中私有属性的使用权
try {
Field Dream = superClass.getDeclaredField("strDream");
Dream.setAccessible(true);
System.out.println(Dream.get(person));
} catch (Exception ex) {
ex.printStackTrace();
}
}
// 调用此方法出现异常java.lang.InstantiationException
public final static void invokePrivateConstractor(Person person) {
Class<?> cls = person.getClass();
Class<?> superClass = cls.getSuperclass();
try {
// 有下面的注释可以证明我的想法是可以站住脚的
// Returns a Constructor object that reflects the specified public
// constructor of the class represented by this Class object.
Constructor<?> Dream = superClass.getConstructor(String.class);
Dream.setAccessible(true);
Dream.newInstance("I have a dream!");
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
上面的只是主函数测试类,没有接口、抽象类等,全部代码在下面的链接处,需要的话可以下载的