反射

reflect机制:在运行状态时 对任一类(通过class对象)都可以知道里面的类的属性和方法.

获取class对象的三种方式:

1.通过new实例化对象然后调Object的getClass()方法

User a=new User();
Class c1=a.getClass();
2.通过类的Qualified Name 然后调用Class.forName();---->一般都用这种方法
String className="com.fitch.reflect.User";
Class c2=Class.forName(className);
3.任何数据类型都有一个静态属性.class .
 Class c3=int.class;
 c3=double[].class;
 c3=User.class;
如果要看class文件 可以在你的项目里的.classpath文件里有显示对象存放的目录,然后根据class path entry kind="output"节点里的路径来找到.class文件.
 

new实例化对象时,会根据new的类的名称找寻该类的字节码文件(.class)(java虚拟机来识别立马的字节码). 并加载进入内存 然后创建该类的字节码对象(Class对象) 并接着创建该字节码文件中对应的对象实例

创建对象:(虽然new实例化比较简洁 但是下面这种方法扩展性较强)

1.创建字节码对象:(还没有实例化)

String className="com.fitch.reflect.User";
Class c2=Class.forName(className);
2.实例化
Object obj=c2.newInstance();--->默认调用类的无参构造器
若要 指定构造函数来实例化 则先获取Class对象的构造器对象Constrctor 然后利用构造器对象.newInstance(参数)

 Constructor<User> con=c2.getConstructor(String.class,int.class);
     User user=con.newInstance("小米",22);
利用Class对象获取字段或方法
字段:
 Field name=c2.getField("name");//获取可以访问的字段 私有字段不可访问
Field age=c2.getDeclaredField("age");//获取所有字段 包括私有
虽然可以获取到私有的 不能用 否则报错illegalAccessException. 反射机制默认行为受限于java访问控制,然而 如果一个java程序
没有受到安全管理器的控制 就可以覆盖访问控制.为了达到这个目的 需调用Field,Method 或Constructor对象的setAccessible
方法.
age.setAccessible(true);
然后可以调用
  Object a=age.get(user);//获取user实例中的age值
age.set(user, 33);//给字段赋值
方法method:
 Method[] methods=c2.getMethods();//获取公共方法
     methods=c2.getDeclaredMethods();//所有方法
     Method method=c2.getMethod("show", String.class);//show方法名 后面的是参数.如果没有参数 则为null
     method.invoke(user, "dd");//user实例 dd为方法参数
















发布了53 篇原创文章 · 获赞 5 · 访问量 8万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章