反射
来源:互联网 发布:java dos 命令 编辑:程序博客网 时间:2024/05/17 03:55
基础:
实现反射的基础类:
- Class类:代表一个类。(核心)
- Field 类:代表类的成员变量(成员变量也称为类的属性)。
- Method类:代表类的方法。
- Constructor 类:代表类的构造方法。
- Array类:提供了动态创建数组,以及访问数组的元素的静态方法
- Proxy类以及InvocationHandler接口:提供了动态生成代理类以及实例的方法
Class类的方法有:
- getName():获得类的完整名字(包括包名字)
- getFields():获得类的public类型的属性
- getDeclaredFields():获得类的所有属性(包括private,protected等)
- getMethods():获得类的public类型的方法
- getDeclaredMethods():获得类的所有方法
- getMethod(String name, Class[]
parameterTypes):获得类的特定方法,name参数指定方法的名字,parameterTypes 参数指定方法的参数类型 - getConstructors():获得类的public类型的构造方法
- getConstructor(Class[] parameterTypes):获得类的特定构造方法,parameterTypes参数指定构造方法的参数类型
- newInstance():通过类的不带参数的构造方法创建这个类的一个对象
反射之基本方法:
这块代码请从下往上看,为了调试,本人都注释了,自己搞一下~)
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchMethodException, NoSuchFieldException { /** * 反射机制的动态代理 */ //这边再说 /** * 通过反射机制操作某个类的属性 */// Class<?> class1 = Class.forName("ModelC");// Object obj = class1.newInstance();// // 可以直接对 private 的属性赋值// Field field = class1.getDeclaredField("name");// //设置些属性是可以访问的// field.setAccessible(true);// field.set(obj, "老王");// System.out.println(field.get(obj)); /** * 通过反射机制调用某个类的方法 */// Class<?> class1 = Class.forName("ModelC");// Method method3 = class1.getMethod("say");// method3.invoke(class1.newInstance());//// Method method = class1.getMethod("daYin", String.class);// method.invoke(class1.newInstance(), "hahahaha");//// Method method2 = class1.getMethod("jiafa", int.class, int.class);// method2.invoke(class1.newInstance(), 1,2); /** * 获得类的全部方法 */// Class<?> class1 = Class.forName("ModelC");// Method[] methods = class1.getMethods();// for(int i = 0; i<methods.length;i++){// Class<?> returnType = methods[i].getReturnType();// Class<?> para[] = methods[i].getParameterTypes();// int temp = methods[i].getModifiers();// System.out.print(Modifier.toString(temp) + " ");// System.out.print(returnType.getName() + " ");// System.out.print(methods[i].getName() + " ");// System.out.print("(");// for (int j = 0; j < para.length; ++j) {// System.out.print(para[j].getName() + " " + "arg" + j);// if (j < para.length - 1) {// System.out.print(",");// }// }// Class<?> exce[] = methods[i].getExceptionTypes();// if (exce.length > 0) {// System.out.print(") throws ");// for (int k = 0; k < exce.length; ++k) {// System.out.print(exce[k].getName() + " ");// if (k < exce.length - 1) {// System.out.print(",");// }// }// } else {// System.out.print(")");// }// System.out.println();// } /** * 获得类的全部属性 */// Class<?> class1 = Class.forName("ModelC");//// Field[] fields = class1.getDeclaredFields();// for(int i=0;i<fields.length;i++){// //获取权限修饰符// int mo = fields[i].getModifiers();// String priv = Modifier.toString(mo);// Class<?> type = fields[i].getType();// System.out.println(priv+" "+type.getName()+" "+fields[i].getName());// } /** * 获得父类,或者接口的属性 */// Class<?> class1 = Class.forName("ModelC");// Field[] fields = class1.getFields();// for(int i=0;i<fields.length;i++){// //获取权限修饰符// int mo = fields[i].getModifiers();// String priv = Modifier.toString(mo);// Class<?> type = fields[i].getType();// System.out.println(priv+" "+type.getName()+" "+fields[i].getName());// } /** * 获得类构造方法,通过构造方法建对象 */// Class<?> class1 = Class.forName("ModelC");// System.out.println(class1.getName());// ModelC modelC = (ModelC)class1.newInstance();// modelC.setName("fw");// modelC.setAge(13);// System.out.println(modelC.toString());//// Constructor<?> constructors[] = class1.getConstructors();// ModelC modelC2 = (ModelC)constructors[1].newInstance("fw2");// System.out.println("modelC2:"+modelC2.toString());// for(int i=0; i<constructors.length; i++){// Class<?> clazzs[] = constructors[i].getParameterTypes();// for (int j = 0; j < clazzs.length; j++) {// if (j == clazzs.length - 1)// System.out.print(clazzs[j].getName());// else// System.out.print(clazzs[j].getName() + ",");// }// System.out.println(")");// } /** * 获得接口 */// Class<?> class1 = Class.forName("Adapter.PlayGanmes");// Class<?> intf[] = class1.getInterfaces();// for(int i = 0 ; i<intf.length;i++){// System.out.println(intf[i].getName());// } /** * 获得父类 */// Class<?> class1 = Class.forName("Bridge.Black");// Class<?> class2 = class1.getSuperclass();// System.out.print(class2.getName()); }
引用到的两个类:
public class ModelC extends Father{ private String name; private int age; public ModelC(){ super(); } public ModelC(String name){ this.name = name; } public ModelC(String name,int age){ this.name = name; this.age = age; } public void say(){ System.out.println("hello"); } public void daYin(String oo){ System.out.println(oo); } public void jiafa(int a1,int a2){ System.out.println(a1+a2); } private void method1(){ System.out.println(this.name+","+this.age); } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String toString(){ return "[name:"+this.name+", age:"+age+"]"; }}
public class Father { public String sex; public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; }}
反射之应用:
/** * 在泛型为Integer的ArrayList中存放一个String类型的对象。 */ public void method1() throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { ArrayList<Integer> arrayList = new ArrayList<Integer>(); //获得方法 Method method = arrayList.getClass().getMethod("add",Object.class); //发送存放请求 method.invoke(arrayList,"我是一个String"); System.out.print(arrayList.get(0)); } /** *通过反射取得并修改数组的信息 */ public void method2(){ int[] temp = {1,2,3,4,5}; //获取数据的类型 Class<?> demo = temp.getClass().getComponentType(); System.out.println("数组类型: " + demo.getName()); System.out.println("数组长度 " + Array.getLength(temp)); System.out.println("数组的第一个元素: " + Array.get(temp, 0)); Array.set(temp, 0, 100); System.out.println("修改之后数组第一个元素为: " + Array.get(temp, 0)); } /** *通过反射机制修改数组的大小 * @param obj int[] temp = {1,2,3,4,5}; * @param len 10 * @return */ public Object method3(Object obj,int len){ Class<?> arr = obj.getClass().getComponentType(); Object newArr = Array.newInstance(arr,len); System.arraycopy(obj, 0, newArr, 0, Array.getLength(obj)); // 打印出来看一看 for (int i = 0; i < Array.getLength(newArr); i++) { System.out.print(Array.get(newArr, i) + " "); } return newArr; }
0 0
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 反射
- 使用百度编辑器的时候的一个小bug
- tensorflow入门基础
- mysql 语句
- 论文提要“Fast Feature Pyramids for Object Detection”
- 在mac和windows下python cat和type命令用法
- 反射
- 通过IP地址查找位置(2)
- servlet3.0使用注解配置后访问无效
- 1096. Consecutive Factors (20)[数学逻辑]
- spring aop 不能加在controller上,能加在service上
- 使用openSMILE提取MFCC简易教程(Mac)
- pyqt4原始例程--将文本框LineEdit的内容输出并打印
- 数据库之间同步介绍
- servlet3.0 异步处理