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程序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为方法参数