黑马程序员_反射学习心得

来源:互联网 发布:js中window对象的方法 编辑:程序博客网 时间:2024/05/16 00:54

------- android培训、java培训、期待与您交流! ----------

Java的所有类都有一个与之对应的Class类的对象,用来描述类的属性,如:类名,包名,构造器(Constructor),成员变量(Field),成员方法(Method)……每个Class对象对应一份字节码。

 

获得某个类的Class对象,有三种方法(以String类为例):

1.      String.class;

2.      Class.forName(“java.lang.String”);

3.      String str = “abc”;  str.getClass();


9个预定义的Class对象:

boolean, byte, char, short, int, long, float,double, void

 

基本类型的包装类封装了常量TYPE保存基本类型的Class对象(字节码)

 

数组也是一种类型,有对应的Class对象


反射

反射就是把java类中的各种成分映射成相应的java类。

import java.lang.reflect.*;public class TestClass {public static void main(String[] args) throws Exception {A a = new A();Class cls1 = A.class;Class cls2 = Class.forName("A");Class cls3 = a.getClass();System.out.println(cls1.isPrimitive());//是否是9个基本类型之一//System.out.println(void.class.isPrimitive());a = (A)cls1.newInstance();System.out.println("int[] isArray : " + int[].class.isArray());String className = cls1.getName();//取得类名Package pak = cls1.getPackage();//取得类所在的包名/** * 构造方法反射 */Constructor con = cls1.getConstructor(null);//取得具有指定参数列表的public构造器Constructor[] cons = cls1.getConstructors();//取得所有public构造器A b = (A)con.newInstance(null);//通过构造器创建实例对象/** * 成员变量反射 */Field fld1 = cls1.getField("str1");//取得具有指定名字的public字段Field fld2 = cls1.getDeclaredField("str4");fld2.setAccessible(true);Field[] flds = cls1.getFields();//取得所有public字段String s = (String)fld2.get(a);fld1.set(a, "abc");System.out.println(a.str1);for(Field field : flds) {if(field.getType()==String.class) {//getTpe()取得字段的类型String ss = (String)field.get(a);ss = ss.replace('a', 'b');field.set(a, ss);}}System.out.println(a.str1);/** * 成员方法反射 */Method mhd = cls1.getMethod("f1", null);//取得指定名称和指定参数列表的public方法Method[] mhds = cls1.getMethods();//取得所有public方法mhd.invoke(a, null);}}class A {public String str1 = "aaa";protected String str2 = "bbb";String str3 = "ccc";private String str4 = "ddd";public A() {}public void f1() {System.out.println("f1 is invoked.");}protected void f2() {}void f3() {}private void f4() {}}



0 0
原创粉丝点击