手记

反射------------------

Class类:
类是对象 java.lang.Class的实例对象 它的实例就是每一个对象所属的类 那这个对象怎么表示呢?
//第一种
User.class int.class String.class..... Integer.calss 完全跟int不一样 void.class关键字
//第二种 已知对象
user.getClass();
//第三种
class.forNmae("java.util.Date");
以上三种方法都可以通过newInstance()方法创建对象 如果不知道具体创建的对象是哪个 就可以用多态
动态加载类(运行时刻):
第三种是动态加载类 newInstance()
静态加载类(编译时)
new创建对象是编译时加载 如果找不到类就会报错

基本API通过这些api 拿到类的全部信息
public static void main(String[] args) throws ClassNotFoundException {
Class d=Demo2.class;
Method [] m=d.getMethods();//父 子的所有public方法
Method [] m1=d.getDeclaredMethods();//只有自己的所有方法 不管访问权限
/**

  • 获取返回值 方法名 获取参数类型
  • import java.lang.reflect.Method;
  • */
    for(int i=0;i<m.length;i++)
    {
    Class returnType=m[i].getReturnType();
    Class []par=m[i].getParameterTypes();
    System.out.println(returnType.getName());

     }
     /***
  • 成员变量
  • import java.lang.reflect.Field;
    /
    Field[] fs=d.getFields();//public的 父子
    Field [] fss=d.getDeclaredFields();//不问返回值 自己
    for(Field field:fss)
    {
    Class typeNmae=field.getType();
    }
    /

    构造函数
    import java.lang.reflect.Constructor;
    /
    Constructor []cs=d.getDeclaredConstructors();
    }
    方法的反射操作:
    @SuppressWarnings("unchecked")
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
    Class d=Demo2.class;
    /
  • 如何获取某一个方法===方法的名称和参数列表决定一个方法
  • method.invoke(名称,参数)
    */
    try {
    Method m=d.getMethod("say", new Class[]{int.class,int.class});

                 //方法反射就是用m对象来进行方法调用  效果完成相同
                 //传对象
                 Demo2 demo=new Demo2();
                 m.invoke(demo, new Class[]{int.class,int.class});//返回值本来方法返回什么就是什么
          } catch (NoSuchMethodException e) {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
          } catch (SecurityException e) {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
          }
0人推荐
随时随地看视频
慕课网APP