您的位置:首页 > 职场人生

黑马程序员——反射认识二Constructor.java

2014-07-18 11:22 393 查看
import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.Arrays; import java.lang.reflect.Array; //构造方法的调用Constructor class Demo1{ public static void main(String [] args) throws Exception{ /*Class classString = Class.forName("java.lang.String"); //Class classString = String.class; //Class class String = new String().getClass();

Constructor [] constructor = classString.getConstructors(); Constructor constructor1 = classString.getConstructor(String.class);

System.out.println(constructor1); for(Constructor c:constructor){ System.out.println(c.getName()); }*/ //获取String对象的方式: String str = null; //这里需要强制类型的转化,Class.forName("java.lang.String").newInstance()的 //返回值是Object类型的 System.out.println(str); //newInstance会自动初始化,不是null,难道是“”; String str2 = (String)Class.forName("java.lang.String").newInstance(); System.out.println(str2); Constructor constructor = String.class.getConstructor(String.class); //System.out.println(constructor.getName()+".....");

//Constructor里的newInstrance(Object object),这里的Object是该构造方法的参数类型对应的对象,并为该构造方法初始化一个值,如字符串类型就是new String("某个值");,整形就用new Integer(某个数)

String str3 = (String)constructor.newInstance(new String("123")); System.out.println(str3);

} }

//成员变量的调用Field class Person{ private int age; private String name; public Person(String name,int age){ this.name = name; this.age = age; } } class Demo2{ public static void main(String [] args) throws Exception{ Person per = new Person("meng",4); Class class1 = per.getClass(); //getField()只能获取类中的公共成员变量,即修饰符为public,其他的获取不了 //Field field1 = class1.getField("name"); /* 暴力反射: getDeclaredField()方法可以获取类中已经声明了的成员变量。 field1.setAcccessible(true);Field继承AccessibleObject类,它里面有setAccessible() 方法,如果是true的话,它就取消java的语言访问检查。false的话就执行 */ Field field1 = class1.getDeclaredField("name"); field1.setAccessible(true); System.out.println(field1.get(per)); Field field2 = class1.getDeclaredField("age"); field2.setAccessible(true); System.out.println(field2.get(per));

} }

class Root{ private String name = null; private String color = null; private String mao = null;

public Root(String name,String color,String mao){ this.name = name; this.color = color; this.mao = mao; } }

class Demo3{ public static void main(String [] args) throws Exception{ Root root = new Root("advabab","blue","blog"); Field [] field = root.getClass().getDeclaredFields(); for(Field f:field){ if(f.getType()==String.class){ f.setAccessible(true); String str = (String)f.get(root); String newStr = str.replace("b","a"); f.set(root,newStr); System.out.println(f.get(root)); } }

} }

//成员方法的调用Method class Demo4{ public static void main(String [] args) throws Exception{ String str = "1345666"; Method method = String.class.getMethod("indexOf",String.class); //invoke()第一个参数是包涵该方法的类的一个对象,如果该方法是静态的,第一个参数就是null, //从第二个开始,以后的参数是传给对象,是用Object接收的, //所以,基本类型装箱强制转为Object,引用类型像String和数组都是传一个初始化的对象, //然后强制类型转换为Object,这里是为了统一使用JDK1.5的语法,直接new char[]{'1','2'} //会先调用JDK1.4的语法,这时有可能会发生错误,例如主方法main, //所以,我们都统一使用JDK1.5的语法,即将数组转化成一个Object对象 //下面的结果输出1 System.out.println(method.invoke(str,new String("3"))); Method method2 = String.class.getMethod("charAt",int.class); System.out.println(method2.invoke(str,1)); Method method3 = String.class.getMethod("copyValueOf",char[].class); //cooyValueOf是一个静态方法, System.out.println(method3.invoke(null,(Object)new char[]{'1','2'})); } }

//invoke()方法的第一个参数和第二个参数都代表什么? //第23个视频

class Demo5{ public static void main(String [] args) throws Exception{ //对于基本数据类型和void,getName输出他们类型对应的字符串,例如int,void System.out.println(int.class.getName());//输出int System.out.println(String.class.getName()); //getName输出数组时,先输出“[”,在相应的输出各种类型所对应的字符 System.out.println(String[].class.getName());//输出[Ljava.lang.String System.out.println(int[].class.getName()); System.out.println(void.class.getName());//输出void //必须的是类的Class对象才能调用newInstance(); //System.out.println(int.class.newInstance()); } }

class Demo6{ public static void main(String [] args){ int [] a1 = new int[3]; int [] a2 = new int[8]; int [][] a3 = new int[3][4]; String [] a4 = new String[10]; //每个数组被映射成Class对象时,元素的数据类型和纬度相同的数组共用一个Class对象 System.out.println(a1.getClass()==a2.getClass());//输出true //System.out.println(a1.getClass()==a3.getClass()); //System.out.println(a1.getClass() == a4.getClass());

//由下面可说明数组的父类是Object //对于Object类,接口,基本数据类型或void,getSuperclass返回null //对于数组类型,返回Object的Class实例对象 //System.out.println(int.class.getSuperclass().getName()); //System.out.println(void.class.getSuperclass().getName()); System.out.println(int[][].class.getSuperclass().getName()); System.out.println(int[].class.getSuperclass().getName()); System.out.println(String[][].class.getSuperclass().getName()); System.out.println(String[].class.getSuperclass().getName());//输出java.lang.Object

//由于数组的父类是Object,下面会发生对象的向上转型,基本数据类型 Object o1 = a1; Object o8 = 1; //Object [] o1 = a1;这个是不兼容的 Object o2 = a2; Object[] o3 = a3; Object o4 = a4; Object [] o5 = a4; Object o6 = a3; //在使用asList的方法时,先调用JDK1.4中asList,接收参数是Objec[],这样的话一维 //的基本类型数组就接受不了,这时再调用JDK1.5中的asList,接收参数是T ... a //(即可变参数的类对象),将基本类型数组当做一个参数接收(Object 对象), //但是基本类型数组不支持列表,所以输出的不知道是啥。但是引用数据类型例如String数组 //它直接调用JDK1.4中的asList方法就可以输出了 // System.out.println(Arrays.asList(a1)); System.out.println(Arrays.asList(a4)); } }

class Demo7{ public static void main(String [] args){ //和Integer一样,1首先会自动装箱,然后就是对象之间的赋值 Object o1 = 1; Object o2 = new int [3]; //简言之: 在java中数组是对象,对象数组和原始数据类型数组在使用方法上几乎是完全一致的, //唯一的差别在于对象数组容纳的是引用而原始数据类型数组容纳的是具体的数值。 //Object [] o3 =new int [3]; } }

class Test{ public static void main(String [] args){ String [] str = new String[]{"1","2","4"}; for(String s:args){ System.out.println(s); } } } class Demo8{ public static void main(String [] args) throws Exception{ Test test = new Test(); Method method = test.getClass().getMethod("main",String[].class); System.out.println(method.invoke(test,(Object)new String[]{"112","asd","qwe"})); } }

//数组的应用 //对于数组的反射,大多会用到Array方法,获取和设置数组元素,有时候也会用到Arrays方法操作数组 class Demo9{ public static void main(String [] args){ //如果是普通方法的话,他这里应该是Object接收 String [] str = new String[]{"1","3"}; Class clazz = str.getClass(); if(clazz.isArray()){ int len = Array.getLength(str); for(int i =0;i<len;i++){ System.out.println(Array.get(str,i)); } } //获取数组内元素的类型 Object object = new Object[]{"a",1,'v'}; int len = Array.getLength(object); for(int i = 0;i<len;i++){ System.out.println(Array.get(object,i).getClass().getName()); } } }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: