创建反射的三种方式; 1.Class c1=Username.class ; //找到位置 2.Class c2=use.getClass(); //找到当前类位置 3.Class c3 = Class.forName("class Demo.java3.反射.Username");//通过全名找到位置 4.ClassLoader loa = Username.class.getClassLoader(); //获取此类的类加载器 Class c4=loa.loadClass("class Demo.java3.反射.Username"); 获取所有属性的类型以及修饰符: 1.Field[] fields = c1.getFields();//获取所有的public属性(继承了父类还会找父类的所有属性) 2.Field[] fields1 = c1.getDeclaredFields();//返回该类的所有属性(包括private属性的) 但不包含父类的属性 权限修饰符.数据.类型: Field[] fields = clazz.getDeclaredFields(); //返回该类的所有属性(包括private属性的) 但不包含父类的属性 for(Field f:fields){ //for循环 int i = f.getModifiers(); //输出0,1,2,3,4这样子的 //权限修饰符 String s = Modifier.toString(i);转换回来成普通类型的 //private public Class type=f.getType() //数据类型 String name = f.getName(); //返回: name,age,id 变量名称 } 获取所有方法名: Method[] methods1 = c1.getDeclaredMethods();//返回所在类的方法(所有权限的方法) 和类名称 获取:@注解 权限修饰符.方法名(参数类型1,形参名1).返回值类型 Method[] methods = c1.getDeclaredMethods();//返回所在类的方法(所有权限的方法) <for(Method m1:methods){ Annotation[] annotations = m1.getAnnotations(); //可能会有多个注解所以用数组 <for (Annotation a1:annotations){ System.out.println("获取到的注解:"+a1); } System.out.println( "权限修饰符"+Modifier.toString (m1.getModifiers())+" " +"返回值类型:"+m1.getReturnType().getName()+" " +"方法名:"+m1.getName()//方法名 );//获取所有的方法的(public private)等权限修饰符 加返回值类型 方法名 Class[] types = m1.getParameterTypes(); //获取里面的所有形参 for (Class c:types){ ystem.out.print("形参:"+c.getName()); //输出 } /* 返回: 形参:(形参:java.lang.String) 权限修饰符public 返回值类型:int 方法名:compareTo (形参:java.lang.String) 获取到的注解:@Demo.java3.反射.MyAnnotation(value="hello") }//结束循环 获取抛出的异常: Class[] ex= m1.getExceptionTypes(); //获取抛出的异常 if(ex!=null&&ex.length!=0) //如果为0或者为空就是啥也没有 { for(int i=0;i<ex.length;i++) { System.out.print(" "+"抛出的异常:"+ex[i].getName());//抛出异常 } /* 抛出的异常:java.lang.Exception */ } 构造器(公有和所有的权限修饰符构造器): Constructor[] cs=c1.getConstructors(); //获取当前运行时类中声明为public的构造器 Constructor[] cs1=c1.getDeclaredConstructors(); //获取当前运行时类中所有权限修饰符的构造器 //返回为:private Demo.java3.反射.Person1(java.lang.String,int) 获取运行时代泛型的父类的泛型: Type type1 = c1.getGenericSuperclass();//获取运行时带泛型的父类 ParameterizedType theorized= (ParameterizedType) type1; //获取运行时代泛型的父类的泛型 Type[] Actual = theorized.getActualTypeArguments();//父类可能会有多个泛型所以是数组类型的 /* 不带泛型的父类:class Demo.java3.反射.Creature 获取时带泛型的父类:Demo.java3.反射.Creature<java.lang.String> 运行时代泛型的父类的泛型:class java.lang.String */ 获取运行时的父类: Class aClass = c1.getSuperclass(); //获取运行时的父类 获取运行时带泛型的父类(会用到): Type type = c1.getGenericSuperclass();//获取运行时带泛型的父类 获取运行时类的接口(会用到): Class[] interfaces = cs.getInterfaces(); //获取运行时类的接口 Class[] interfaces1 = cs.getSuperclass().getInterfaces();//获取运行时类的父类的接口 获取运行时类所在的包位置: Package aPackage = cs.getPackage();//获取运行时类所在的包位置 /* 运行时所在的包位置: package Demo.java3.反射 */ 获取运行时类的注解: Annotation[] annotations = cs.getAnnotations();//获取运行时类的注解 /* 运行时类的注解:@Demo.java3.反射. MyAnnotation(value="我是运行时类的注解") */ <--如何调用/获取 运行时类的(属性)(方法)(构造器) 获取指定的属性(支持私有)(修改.查看): Person1 obj = (Person1)cs.newInstance(); //获取指定的构造器 Field name = cs.getDeclaredField("name"); //获取属性 name.setAccessible(true); //必须得实现为true这样子才给你调用私有 name.set(instance,"你好");//往里面放值 Object o = name.get(instance);//获取里面的值 使用方法(支持私有): bject o = cs.newInstance(); //构造器调用空参构造器 Method show = cs.getDeclaredMethod("show", String.class); //输入需要调用参数的方法(名称,和参数) show.setAccessible(true); //保证方法是可访问私有的 Object o1 = show.invoke(o, "我是中国人"); // invok 是调用里面的方法 第一个是类构造器,第二个是参数,如果有返回值就可以接收 调用构造器带参数的构造器(不通用): 一般使用不带参数的因为不适合 Constructor constructor = cs.getDeclaredConstructor(String.class); //调用有参数的构造器 ,指明构造器的参数列表 constructor.setAccessible(true);//保证能访问 Person1 instance = (Person1)constructor.newInstance("我爱我的国家 传输进去构造器的值"); //调用一个参数的构造器 System.out.println(instance.toString());//输出属性有没有发生改变
05-09
488
08-20
152