java反射机制

来源:互联网 发布:app源码模板下载 编辑:程序博客网 时间:2024/06/05 06:09
对class类的认识与了解
package javaReflect;public class javaClass {public static void main(String[] args) throws InstantiationException, IllegalAccessException {/** * 1.首先我们对于java的每一个class应该有一个认识,比如对于我现在定义javaclass类它是不是一个对象呢?       在java内,一切都是对象,因而我们定义的class也是一个对象,他是java.lang.class 类的实例对象 */testClass testclass = new testClass();//2.类的实例对象的表示 例如我们定义了一个testClass,要获得它的class(类 类型),就可以有下面三种方式去写//2.1通过静态成员Class c1 = testClass.class;//每个类都有一个静态成员class,指明类类型//2.2通过get函数Class c2 = testclass.getClass();System.out.println(c1 == c2);//2.3通过forName函数传入类路径Class c3 = null;try { c3 = Class.forName("javaReflect.testClass");} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}//然后我们可以根据得到的class来创建一个类的实例testClass t = (testClass) c1.newInstance();}}
大致了解了类的获取方式,下面展示一下如何通过反射的方式得到每个类的字段,构造函数,自定函数等信息

package javaReflect;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.Method;import java.lang.reflect.Modifier;public class GetClassInfo {//上面我们简单了解class的几种获取方式,接下来我们利用反射机制通过编码来实现获取任意一个类的成员变量,函数类型,//函数返回值,函数的构造函数等功能public static void GetFields(Object obj){Class cl = obj.getClass();//获取所有该类自己声明的成员变量信息Field []fields = cl.getDeclaredFields();for (int i = 0; i < fields.length; i++) {//获取成员变量的类类型Class fieldclass = fields[i].getType();//输出成员变量的访问权限 类型 和 名字System.out.println(getModifiersString(fields[i].getModifiers())+" " +fieldclass.getSimpleName() +" "+fields[i].getName());}}public static void GetConstructor(Object obj){Class cl = obj.getClass();Constructor[] constructors = cl.getConstructors();for (int i = 0; i < constructors.length; i++) {//输出访问权限System.out.print(getModifiersString(constructors[i].getModifiers())+" ");//获取构造函数名字System.out.print(constructors[i].getName()+"(");//方法名字//获取方法的参数类型的类类型Class[] paramsTypes = constructors[i].getParameterTypes();for (int j = 0; j < paramsTypes.length; j++) {//获取参数类型类型名,getSimpleName是只获取类名,getName会得到类路径System.out.print(paramsTypes[j].getSimpleName()+",");}System.out.println(")");}}/** * 获取类的成员函数 * @param obj */public static void GetMethods(Object obj){//获取类的类类型Class cl = obj.getClass();//获取类名//String classname = cl.getName();//获取该类内声明的所有成员函数,如果只获取public 方法那么可以用getMethods(),包括继承自父类的//下面的获取的是自己声明的成员函数,不包括父类,各种类型的方法都可以访问的到Method methods[] = cl.getDeclaredMethods();for (int i = 0; i < methods.length; i++) {//获取访问权限System.out.print(getModifiersString(methods[i].getModifiers())+" ");//获取方法的返回值类型的类类型Class returnType = methods[i].getReturnType();System.out.print(returnType.getSimpleName()+" ");//输出返回值类类型的名字System.out.print(methods[i].getName()+"(");//方法名字//获取方法的参数类型的类类型Class[] paramsTypes = methods[i].getParameterTypes();for (int j = 0; j < paramsTypes.length; j++) {//获取参数类型类型名,getSimpleName是只获取类名,getName会得到类路径System.out.print(paramsTypes[j].getSimpleName()+",");}System.out.println(")");}}public static String getModifiersString(int code){if(Modifier.isPrivate(code))return "private";if(Modifier.isPublic(code))return "public";if(Modifier.isProtected(code))return "protected";return null;}}
package javaReflect;public class testClass {public static void main(String[] args) {String str = "sgj";GetClassInfo.GetFields(str);GetClassInfo.GetConstructor(str);GetClassInfo.GetMethods(str);}}
上面的代码介绍了如何获取到类的各种信息,下面介绍如下如何获取某个类的函数,并且直接根据获取的Method 来执行当前的函数并得到函数结果
package javaReflect;import java.lang.reflect.Method;import sun.reflect.generics.tree.ReturnType;public class MethodsUseByRelect {public static void main(String[] args) throws Exception {test t = new test("");useMethodByReflect(t);}//利用反射技术,来通过第三方来调用某个类的某个函数public static void useMethodByReflect(Object obj) throws Exception{Class cl = obj.getClass();//根据参数类型和函数名字确定函数名字Method m = cl.getMethod("print",int.class,int.class);//通过invoke调用原始的函数Object oint = m.invoke(obj,10,20);//System.out.println(oint);//另一种传参数的形式Method m2 = cl.getMethod("print",new Class[]{String.class,String.class});//得到返回值//获取当前函数的返回值类型Class returntype = m2.getReturnType();//将得到的object类型强制转换成本来的类型Object ob= m2.invoke(obj, new Object[]{"Hello","Word!"});//得到返回值的类型System.out.println(returntype.getSimpleName());//Object o = (ReturnType.class)ob;//returntype.newInstance();}}//类内定义两个同名函数class test{String str;public test(String str) {super();this.str = str;}public String getStr() {return str;}public void setStr(String str) {this.str = str;}public int print(int a,int b){System.out.println(a+b);return a+b;}public test print(String a,String b){System.out.println(a+" "+b);return new test(a+b);}}





原创粉丝点击