java反射机制
程序员文章站
2024-01-20 12:44:04
...
反射机制的定义:
Java 反射机制是在运行状态中,对于任意一个类,都能够获得这个类的所有属性和方法,对于任意一个对象都能够调用它的任意一个属性和方法。这种在运行时动态的获取信息以及动态调用对象的方法的功能称为 Java 的反射机制。
反射机制有什么作用?
1.通过反射可以扩展未知的应用;
2.通过反射可以调用任意一个类的属性和方法;
那么接下来就是练习了:
练习的内容主要是通过反射机制能够访问到另一个类的内容;
一.首先我新建一个类名为test,在类中我定义了类的私有方法,公有方法,还有私有属性,公有属性;
下面是代码:
package Reflect;
public class test {
//定义了一个公有属性
public String m="M";
//定义了了一个私有属性
private String n="N";
public test(){
System.out.println("成功调用无参公有构造方法");
}
private test(String s){
System.out.println("成功调用有参私有构造方法");
}
public void example1(){
System.out.println("成功调用无参的公有方法");
}
private void example2(){
System.out.println("成功调用无参的私有方法");
}
public void example3(String m){
System.out.println("成功调用有参的公有方法"+m);
}
private void example4(String n){
System.out.println("成功调用有参的私有方法"+n);
}
}
二.创建另一个类reflect,通过反射机制反射机制访问上述test类的公有,私有属性和方法;
下面是代码,看不太懂的希望能多看两遍代码中的注释,还是可以懂得,谢谢配合:
package Reflect;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class reflect {
public static void main(String []args){
try {
//获取test类的Class对象
Class c = Class.forName("Reflect.test");
//获取test类的公有构造方法
Constructor constr=c.getConstructor();
//获取test类中的私有构造方法,通过test类可知它的形参是一个字符串型的数据
Constructor constr1=c.getDeclaredConstructor(String.class);
//取消java的访问检查
constr1.setAccessible(true);
//创建对象
Object obj =constr.newInstance();
Object obj1=constr1.newInstance("nice");
//通过Class类获取属性
//公有属性
try {
//获取test类中的公有属性
Field field1=c.getField("m");
//输出test类中的公有属性值
System.out.println(field1.get(obj));
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//私有方法
try {
//获取test类中的私有属性
Field field2=c.getDeclaredField("n");
field2.setAccessible(true);
//输出test类中的私有属性值
System.out.println(field2.get(obj1));
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//调用类的方法
//获取test类中无参公有方法
Method m = c.getMethod("example1");
//获取test类中无参私有方法
Method m1=c.getDeclaredMethod("example2");
//该方法表示取消java语言访问检查
m1.setAccessible(true);
//获取test类中有参公有方法
Method m2=c.getMethod("example3",String.class);
//获取test类中有参私有方法
Method m3=c.getDeclaredMethod("example4",String.class);
//取消java的访问检查
m3.setAccessible(true);
//调用无参方法
m.invoke(obj);
m1.invoke(obj1);
//调用有参方法,需要加入对应的参数类型的数据
m2.invoke(obj1, "没问题");
m3.invoke(obj1, "很正确");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
上一篇: php利用事务处理转账问题_PHP