• 基础知识《八》---Java反射机制


    1.反射可以做什么

    2.反射相关的API

    3.获取Class运行时类的实例的三种方法:

    1)通过运行时类本身的.class属性*****

    Class clazz= Person.class;

    2)通过运行时类的对象获取

    Person p=new Person;

    Class clazz=p.getClass();

    3)通过Class的静态方法获取,//通过此方式,体现反射的动态性。来什么字符串类,就造什么类******

    String className="com.cmge.org.Person";

    Class clazz=Class.forName(className);

    4)通过类加载器

    String className="com.cmge.org.Person";

    ClassLoader loader=this.getClass.getClassLoader();

    Class clazz=loader.loadClass(className);

    System.out.printIn(clazz.getName());

    4.创建运行时类的实例,并获取类的相关结构

    方法一://创建运行时类的实例,使用newInstance(),实际上调用了类的无参构造器。因此要想运行时类的实例创建成功,必须要有无参构造器,并且无参构造器的访问权限是公开的

    String className="com.cmge.org.Person";

    Class clazz=Class.forName(className);

    Object object=clazz.newInstance();

    Person p=(Person)object;

    5、通过反射获取类的完整结构

    1)获取运行时类的属性(getFields()获取公开属性、getDeclaredFileds()获取运行时类申明的全部属性),

    获取属性的修饰符、变量类型、变量名。

    2)获取运行时类的方法

    获取运行时类的方法(getmethods()获取公开的方法、getDeclaredMethods()获取全部方法)

    Class clazz=Person.class;

    Method[]  m1=clazz.getMethods();

    Method[] m2=clazz.getDeclaredMethods();

    获取方法的注释、方法修饰符、方法返回值类型、方法变量名、方法参数列表、方法异常

    for(Method m in m2){

    Annotation[] anns=m.getAnnotations();//获取方法注释

    String str=Modifier.toString(m.getModifiers());//获取方法修饰符

    Class typeclass=m.getReturnType();//获取返回值类型

    Class[] params=m.getParameterTypes();//获取参数列表

    Class[] exps=m.getExceptionTypes();

    }

    3)获取运行时类的构造器及其他

    Class clazz=Person.class;

    Constructor c=clazz.getDeclaredConstructor();//获取构造器

    //获取运行时类的父类、

    //获取父类的泛型、

    Class[] interfaces=clazz.getInterfaces();//获取实现的接口、

    Packge p=clazz.getPackge();//获取所在的包

    Annotation[] anns=clazz.getAnnotations();//获取类的注解

    6、调用运行时类的指定的属性指定的方法

    1)调用指定的属性

    Class clazz=Person.class;

    Field name=clazz.getField("name");

    Person p=(Person) clazz.newInstance();

    name.set(p,"Jerry");//设置指定的属性值

    2)调用指定的方法

    Class clazz=Person.class;

    Method m=clazz.getMethod("show");

    Person p=(Person)clazz.newInstance();

    Object obj=m.invoke(p);//调用指定的方法

    Method m2=clazz.getMethod("info");//其中info是静态的方法

    m2.invoke(Person.class);//调用静态的方法

    Method m3=clazz.getMethod("display",String.class,Integer.class);//调用有两个参数的方法

    Object obj2=m3.invoke(p,"USA",10);

    3)调用指定的构造器

    7、动态代理与AOP

    ******重要,需要重复学习

    视频地址:http://edu.csdn.net/course/detail/809/11015?auto_start=1

  • 相关阅读:
    [NOI2002]银河英雄传说
    Splay普及版
    线段树普及版
    长连接与短连接
    【HTTP】中Get/Post请求区别
    【HTML】知识笔记
    SVN使用教程总结
    《人生只有一次,去做自己喜欢的事》读书笔记
    【HTTP】无状态无连接的含义
    【HTML】解析原理
  • 原文地址:https://www.cnblogs.com/abc8023/p/5049675.html
Copyright © 2020-2023  润新知