邱石的专栏

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

一,反射的概念: 主要是指程序可以访问,检测和修改它本身状态或行为的一种能力,并能根据自身行为的状态和结果,调整或修改应用所描述行为的状态和相关的语义。 反射是java中一种强大的工具,能够使我们很方便的创建灵活的代码,这些代码可以再运行时装配,无需在组件之间进行源代码链接。但是反射使用不当会成本很高! 二,反射机制的作用: 1,反编译:.class–>.java 2,通过反射机制访问java对象的属性,方法,构造方法等; 这样好像更容易理解一些,下边我们具体看怎么实现这些功能。三,具体功能实现: 1,反射机制获取类有三种方法,我们来获取Employee类型第一种方式: Classc1 = Class.forName("Employee"); 第二种方式: java中每个类型都有class 属性. Classc2 = Employee.class; 第三种方式: java语言中任何一个java对象都有getClass 方法 Employeee = new Employee(); Classc3 = e.getClass(); //c3是运行时类 (e的运行时类是Employee) 2,创建对象:获取类以后我们来创建它的对象,利用newInstance:Class c =Class.forName("Employee"); //创建此Class 对象所表示的类的一个新实例 Objecto = c.newInstance(); //调用了Employee的无参数构造方法. 3,获取属性:分为所有的属性和指定的属性: a,,先看获取所有的属性的写法://获取整个类 Class c = Class.forName("java.lang.Integer"); //获取所有的属性? Field[] fs = c.getDeclaredFields(); //定义可变长的字符串,用来存储属性 StringBuffer sb = new StringBuffer(); //通过追加的方法,将每个属性拼接到此字符串中 //最外边的public定义 sb.append(Modifier.toString(c.getModifiers()) + " class " + c.getSimpleName() +"{\n"); //里边的每一个属性 for(Field field:fs){ sb.append("\t");//空格 sb.append(Modifier.toString(field.getModifiers())+" ");//获得属性的修饰符,例如public,static等等 sb.append(field.getType().getSimpleName() + " ");//属性的类型的名字 sb.append(field.getName()+";\n");//属性的名字+回车 } sb.append("}"); System.out.println(sb); b,获取特定的属性,对比着传统的方法来学习:public static void main(String[] args) throws Exception{ //以前的方式: /* User u = new User(); u.age = 12; //set System.out.println(u.age); //get */ //获取类 Class c = Class.forName("User"); //获取id属性 Field idF = c.getDeclaredField("id"); //实例化这个类赋给o Object o = c.newInstance(); //打破封装 idF.setAccessible(true); //使用反射机制可以打破封装性,导致了java对象的属性不安全。 //给o对象的id属性赋值"110" idF.set(o, "110"); //set //get System.out.println(idF.get(o)); } 4,获取方法,和构造方法:getDeclaredMethods():获取所有的方法getReturnType():获得方法的返回类型getParameterTypes();获得方法的传入参数类型getDeclaredMethod("方法名",参数类型.class,……);获得特定的方法构造方法关键字getDeclaredConstructors():获取所有的构造方法getDeclaredConstructor(参数类型.class,……):获取特定的构造方法父类和父接口getSuperclass():获取某类的父类getInterfaces():获取某类实现的接口这样我们就可以获得类的各种内容,进行了反编译。对于JAVA这种先编译再运行的语言来说,反射机制可以使代码更加灵活,更加容易实现面向对象。四。案例1,通过发生获取成员变量并使用 /* * 通过发生获取成员变量并使用 */public class ReflectDemo {public static void main(String[] args) throws Exception {// 获取字节码文件对象Class c = Class.forName("cn.itcast_01.Person");// 获取所有的成员变量// Field[] fields = c.getFields();// Field[] fields = c.getDeclaredFields();// for (Field field : fields) {// System.out.println(field);// }/* * Person p = new Person(); p.address = "北京"; System.out.println(p); */// 通过无参构造方法创建对象Constructor con = c.getConstructor();Object obj = con.newInstance();System.out.println(obj);// 获取单个的成员变量// 获取address并对其赋值Field addressField = c.getField("address");// public void set(Object obj,Object value)// 将指定对象变量上此 Field 对象表示的字段设置为指定的新值。addressField.set(obj, "北京"); // 给obj对象的addressField字段设置值为"北京"System.out.println(obj);// 获取name并对其赋值// NoSuchFieldExceptionField nameField = c.getDeclaredField("name");// IllegalAccessExceptionnameField.setAccessible(true);nameField.set(obj, "林青霞");System.out.println(obj);// 获取age并对其赋值Field ageField = c.getDeclaredField("age");ageField.setAccessible(true);ageField.set(obj, 27);System.out.println(obj);}}2,通过反射获取成员方法并使用public class ReflectDemo {public static void main(String[] args) throws Exception {// 获取字节码文件对象Class c = Class.forName("cn.itcast_01.Person");// 获取所有的方法// Method[] methods = c.getMethods(); // 获取自己的包括父亲的公共方法// Method[] methods = c.getDeclaredMethods(); // 获取自己的所有的方法// for (Method method : methods) {// System.out.println(method);// }Constructor con = c.getConstructor();Object obj = con.newInstance();/* * Person p = new Person(); p.show(); */// 获取单个方法并使用// public void show()// public Method getMethod(String name,Class<?>… parameterTypes)// 第一个参数表示的方法名,第二个参数表示的是方法的参数的class类型Method m1 = c.getMethod("show");// obj.m1(); // 错误// public Object invoke(Object obj,Object… args)// 返回值是Object接收,第一个参数表示对象是谁,第二参数表示调用该方法的实际参数m1.invoke(obj); // 调用obj对象的m1方法System.out.println("———-");// public void method(String s)Method m2 = c.getMethod("method", String.class);m2.invoke(obj, "hello");System.out.println("———-");// public String getString(String s, int i)Method m3 = c.getMethod("getString", String.class, int.class);Object objString = m3.invoke(obj, "hello", 100);System.out.println(objString);// String s = (String)m3.invoke(obj, "hello",100);// System.out.println(s);System.out.println("———-");// private void function()Method m4 = c.getDeclaredMethod("function");m4.setAccessible(true);m4.invoke(obj);}}

我们首先去了象鼻山,那里景色秀丽神奇,

邱石的专栏

相关文章:

你感兴趣的文章:

标签云: