java中的反射

反射API

       u反射API用于反应在当前Java虚拟机中的类、接口或者对象信息

u功能
1) 获取一个对象的类信息.

          2) 获取一个类的访问修饰符、成员、方法、构造方法以及超类的信息.

          3) 检获属于一个接口的常量和方法声明.

          4) 创建一个直到程序运行期间才知道名字的类的实例.

          5) 获取并设置一个对象的成员,这个成员的名字是在程序运行期间才知道.

  1. 检测一个在运行期间才知道名字的对象的方法

       利用Java反射机制可以很灵活的对已经加载到Java虚拟机当中的类信息进行检测。这种检测在对运行的性能上会有些减弱,所以什么时候使用反射,要靠业务的需求、大小,以及经验的积累来决定。

下面用反射的一个例子

package ForFindWork;


import java.lang.reflect.Field;
import java.lang.reflect.Method;


import javax.swing.JOptionPane;


public class reflectimpl {


public static void main(String[] args) {
// TODO Auto-generated method stub
new reflectimpl();
}

public reflectimpl() {
// TODO Auto-generated constructor stub
/*
String classinf=JOptionPane.showInputDialog(null,"输入类全路径");
try {
Class<?> clazz=Class.forName(classinf);
System.out.println(clazz);
System.out.println("---------------------------------------------->>");
Method[] methods=clazz.getDeclaredMethods();
for(Method me:methods)
System.out.println(me.toString());
System.out.println("---------------------------------------------->>");
Field[] fields=clazz.getDeclaredFields();
for(Field field:fields)
System.out.println(field.toString());
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
*/
try {
Class<?> clazz=Class.forName("ForFindWork.reit");
System.out.println(clazz);
System.out.println("-------------------->>");
Method[]  methods=clazz.getDeclaredMethods();
for(Method me:methods)
System.out.println(me.toString());
System.out.println("-------------------->>");
Field[] fields=clazz.getDeclaredFields();
for(Field fe:fields)
System.out.println(fe.toString());
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}


}


class reit{
int cout=1;
int ans=2;
String str="...";
public reit(){

}

public int add(int count,int ans) {
return count+ans;
}
public String getstr(){
return this.str;
}
}

编译器联想原理: 通过上面代码,我们可以知道编译工具为什么能够一按点就能列出用户当前对象的属性和方法了。它是先获得用户输入对象的字符串,然后利用反射原理来对这样的类进行自审,从而列出该类的方法和属性。

下面我们看在用反射调用一个类中方法的例子

package ForFindWork;


import java.lang.reflect.Method;


public class invokeMethod {


public static void main(String[] args) {
// TODO Auto-generated method stub
new invokeMethod();
}
public invokeMethod() {
// TODO Auto-generated constructor stub

testinvoke testit=new testinvoke();//获得这个对象的实例
try {
Object[] args=new Object[]{new Integer(1),new Integer(2)};//方法中的参数
System.out.println(invokemethodit(testit, "add", args));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

}

public Object invokemethodit(Object obj,String methodName,Object[] args) throws Exception {
Class objclass=obj.getClass();//获得这个对象的class
Class[] argsclass=new Class[args.length];//获得参数的class
for(int i=0;i<args.length;i++)
argsclass[i]=args[i].getClass();
Method method=objclass.getMethod(methodName, argsclass);//根据方法名和参数找到这个方法
return method.invoke(obj, args);//调用这个类中的方法
}
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值