黑马程序员——反射:把java类中的各种成分映射为相应的java类

来源:互联网 发布:react.js 编辑:程序博客网 时间:2024/04/30 04:37
 ------- <a href="http://www.itheima.com" target="blank">android培训</a>

代码演示:

import java.lang.reflect.*;/* * 反射:把java类中的各种成分映射为相应的java类 * */public class ReflectTest {public static void main(String[] args)throws Exception{// TODO Auto-generated method stubString s = "abc";//获取字节码的三种方法Class cls1 = String.class; //类名获取Class cls2 = s.getClass(); //对象方法获取Class cls3 = Class.forName("java.lang.String"); //静态方法获取System.out.println(cls1);System.out.println(cls2);System.out.println(cls3);//都是同一个字节码System.out.println(cls1 == cls2);System.out.println(cls1 == cls3);//判断是否是九个基本类型字节码System.out.println(cls1.isPrimitive());System.out.println(int.class == Integer.class);System.out.println(int.class == Integer.TYPE); System.out.println(int[].class.isPrimitive());constructorClass();fieldClass();methodClass();mainReflect(args[0]);arrayReflect();}/* * 反射相关类: Method 类表示得到类中的某个方法 * */private static void methodClass() throws Exception{String str = "efg";//获得指定函数方法Method methods = str.getClass().getMethod("charAt", int.class);//调用函数System.out.println(methods.invoke(str, 2));//jdk 1.5 以前的调用     用数组代表可变参数System.out.println(methods.invoke(str, new Object[]{0}));}/* * 反射相关类: Constructor 类代表某个类中的一个构造方法 * 得到某个类的构造方法 * //得到类中的全部构造函数 * Constructor[] constructors =  * Class.forName("java.lang.String").getConstructors(); * //得到指定参数的构造函数 * Constructor constructors = * Class.forName("java.lang.String").getConstructor(StringBuffer.class); * 创建实例对象: * //创建指定参数的实例对象 * String s = (String)constructors.newInstance(new StringBuffer("abc")); *  * Class.newInstance()方法:创建该类默认构造函数的实例对象 * String s = (String)class.forName("java.lang.String").newInstance(); * 注意:该方法内部实现用到了缓存机制来保存 默认的构造方法的实例对象。 * */public static void constructorClass()throws Exception{//用反射机制来创建一个new String(new StringBuffer("abc"))对象//获取一个构造函数Constructor constructor = Class.forName("java.lang.String").getConstructor(StringBuffer.class);//用构造函数获取一个对象String s = (String)constructor.newInstance(new StringBuffer("abc"));System.out.println(s.charAt(2));//用反射创建一个默认的构造函数StringBuffer sb = (StringBuffer)Class.forName("java.lang.StringBuffer").newInstance();sb.append("dafdafwe");System.out.println(sb);}/* * 反射相关类: Field 类代表取出对象中变量的值 * */public static void fieldClass() throws Exception{ReflectPoint rp = new ReflectPoint(5, 10);//获取类的成员y字段Field fieldY = rp.getClass().getField("y");//打印对象成员y的值System.out.println(fieldY.get(rp));//暴力反射获取私有变量的值Field fieldX = rp.getClass().getDeclaredField("x");fieldX.setAccessible(true);System.out.println(fieldX.get(rp));fieldShow(rp);System.out.println(rp.toString());}/* * 练习: 修改类中的成员变量中的字符串中的字符‘a’为‘b’ * */private static void fieldShow(ReflectPoint rp) throws Exception{//获取类中的成员字段Field[] fields = rp.getClass().getFields();//System.out.println(fields.length);//迭代数组for(Field field : fields){//判断是否为String类型if(field.getType() == String.class){String s = (String)field.get(rp);String news = s.replace('b', 'a');//将对象中的成员替换field.set(rp, news);}}}/* * 用反射来调用main方法 * */public static void mainReflect(String str) throws Exception{//传统调用main方法//ReflectMain.main(new String[]{"aaa", "bbb", "ccc"});//用反射来调用main方法,当不知道类名的时候适合用String startingClassName = str;//指定函数名和参数类型获取方法 Method method = Class.forName(startingClassName).getMethod("main", String[].class);method.invoke(null, new Object[]{new String[]{"你好", "呵呵", "你们好"}}); //注意JDK1.5的自动拆封装要封装成对象}/* * 利用数组的反射来打印数组中的元素 * */public static void arrayReflect(){int[] a = new int[]{1, 3, 5};int[][] b = new int[][]{new int[]{5, 10, 30}, new int[]{15, 20}};String[] str = new String[]{"aaa", "bbb", "ccc"};arrayPrint(str);}/* * 反射在数组中的应用 * */public static void arrayPrint(Object obj){if(obj.getClass().isArray()){int len = Array.getLength(obj);for(int i=0; i<len; i++){System.out.println(Array.get(obj, i));}}else{System.out.println(obj);}}}class ReflectMain{public static void main(String []args){System.out.println(args.length); for(int i=0; i<args.length; i++){System.out.println(args[i]); }}}

<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------


0 0