---------------------- android培训、java培训、期待与您交流! ----------------------
1: 反射
反射就是把Java类中的各种成分映射成相应的java类。例如,一个Java类中用一个Class类的对象来表示,一个类中的组成部分:成员变量,方法,构造方法,包等等信息也用一个个的Java类来表示,就像汽车是一个类,汽车中的发动机,变速箱等等也是一个个的类。表示java类的Class类显然要提供一系列的方法,来获得其中的变量,方法,构造方法,修饰符,包等信息,这些信息就是用相应类的实例对象来表示,它们是Field、Method、Contructor、Package等等。
一个类中的每个成员都可以用相应的反射API类的一个实例对象来表示,通过调用Class类的方法可以得到这些实例对象。
获取Class实例的三种方式:
(1)利用对象调用getClass()方法获取该对象的Class实例;
(2)使用Class类的静态方法forName(),用类的名字获取一个Class实例
(3)运用.class的方式来获取Class实例,对于基本数据类型的封装类,还可以采用.TYPE来获取相对应的基本数据类型的 Class实例
class ReflectTest { public static void reflect()throws Exception { String str1 = "abc"; Class cls1 = str1.getClass(); Class cls2 = String.class; Class cls3 = Class.forName("java.lang.String"); System.out.println(cls1 == cls2); System.out.println(cls1 == cls3); System.out.println(cls1.isPrimitive()); //String 不是一个基本类型 System.out.println(int.class.isPrimitive()); //int 是一个基本类型 System.out.println(Integer.class.isPrimitive()); System.out.println(int.class == Integer.TYPE); System.out.println(int[].class.isPrimitive() );//数组不是原始类型 System.out.println(int[].class.isArray()); } }
2: Constructor类
Constructor类代表某个类中的一个构造方法
得到某个类所有的构造方法:
例子:Constructor [] constructors=Class.forName("java.lang.String").getConstructors();
得到某一个构造方法:
例子: Constructor constructor =Class.forName(“java.lang.String”).getConstructor(StringBuffer.class);
创建实例对象:
通常方式:String str = new String(newStringBuffer("abc"));
反射方式: String str =(String)constructor.newInstance(new StringBuffer("abc"));
Class.newInstance()方法:例子:String obj =(String)Class.forName("java.lang.String").newInstance();该方法内部先得到默认的构造方法,然后用该构造方法创建实例对象。该方法内部的具体代码是怎样写的呢?用到了缓存机制来保存默认构造方法的实例对象。
3:Field类
Field类代表某个类中的一个成员变量
class Outer { <span style="white-space:pre"> </span>private static int x = 3; <span style="white-space:pre"> </span>public int xx =88;
Outer ter = new Outer(); Field fd = ter.getClass().getDeclaredField("xx"); fd.setAccessible(true); fd.setInt(ter, 99); System.out.println(fd.get(ter));
Field综合案例:
class ReflectPoint{ public String s1 = "str1"; public String s2 ="str2"; public String s3 = "str3"; } public class Jiujiu { public static void main(String[] args) throws IllegalArgumentException, IllegalAccessException { ReflectPoint rp = new ReflectPoint(); Field[] fs = rp.getClass().getFields(); for(Field f : fs) { if(f.getType() == String.class) { String strold = (String)f.get(rp); String strNew = strold.replace('s', 'b'); f.set(rp, strNew); } } System.out.println(rp.s1+" "+ rp.s2+" "+ rp.s3); } }
4:Method类
Method类代表某个类中的一个成员方法
得到类中的某一个方法:例子: Method charAt =Class.forName("java.lang.String").getMethod("charAt",int.class);
调用方法:
通常方式:System.out.println(str.charAt(1));反射方式: System.out.println(charAt.invoke(str,1));
•如果传递给Method对象的invoke()方法的第一个参数为null,这有着什么样的意义呢?说明该Method对象对应的是一个静态方法!
ljdk1.4和jdk1.5的invoke方法的区别:
Jdk1.5:public Object invoke(Object obj,Object...args)Jdk1.4:public Object invoke(Object obj,Object[]args),即按jdk1.4的语法,需要将一个数组作为参数传递给invoke方法时,数组中的每个元素分别对应被调用方法中的一个参数,所以,调用charAt方法的代码也可以用Jdk1.4改写为 charAt.invoke(“str”, new Object[]{1})形式。
class ReflectPoint{ public String s1 = "str1"; public String s2 ="str2"; public String s3 = "str3"; public String getS1() { return s1; } public void setS1(String s1) { this.s1 = s1; } } public class Jiujiu { public static void main(String[] args) throws Exception { ReflectPoint rp = new ReflectPoint(); try { Method md = rp.getClass().getMethod("setS1", String.class); md.invoke(rp, "bbbbb"); } catch (SecurityException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println(rp.s1);//输出的是bbbb } }
带数组的函数的反射:
public class Jiujiu { public static void main(String[] args) throws Exception { Method mi = MMain.class.getMethod("main", String[].class); mi.invoke(null, <span style="color:#ff0000">new Object[]</span>{new String[]{"asdf","2131","3dsdfsd"}}); } } class MMain { public static void main(String[] args) { for(String a: args) System.out.println(a); } }
5: 数组的反射应用“
public static void main(String[] args) throws Exception { int [] a1 = new int[]{1,2,3,4}; int [] a2 = new int[4]; int [][] a3 = new int[2][3]; String[] a4 = new String[]{"a","b","c","d"}; Object o1 = a1; System.out.println(a1.getClass() == a2.getClass()); //true System.out.println(a1.getClass().getName()); System.out.println(a1.getClass().getSuperclass().getName()); System.out.println(Arrays.asList(a1)); //[[I@de6ced] System.out.println(Arrays.asList(o1));[[I@de6ced] System.out.println(Arrays.asList(a4));//[a, b, c, d] // System.out.println(a1.getClass() == a4.getClass()); // System.out.println(a1.getClass() == a3.getClass()); }
public class Jiujiu { public static void printObject(Object obj) { Class cls = obj.getClass(); if(cls.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); } } public static void main(String[] args) throws Exception { int [] a1 = new int[]{1,2,3,4}; int [] a2 = new int[4]; int [][] a3 = new int[2][3]; String[] a4 = new String[]{"a","b","c","d"}; printObject(a1); } }
------------- java培训、android培训、java博客、java学习型技术博客、期待与您交流! -------------