访问字段

对任意的一个Object实例,只要我们获取了它的Class,就可以获取它的一切信息。 我们先看看如何通过Class实例获取字段信息。Class类提供了以下几个方法来获取字段: Field getField(name):根据字段名获取某个public的field(包括父类) Field getDeclaredField(name):根据字段名获取当前类的某个field(不包括父类) Field
访问字段

调用方法

我们已经能通过Class实例获取所有Field对象,同样的,可以通过Class实例获取所有Method信息。Class类提供了以下几个方法来获取Method: Method getMethod(name, Class...):获取某个public的Method(包括父类) Method getDeclaredMethod(name, Class...):获取当前类的某个Method(不包括父类)
调用方法

调用构造方法

我们通常使用new操作符创建新的实例: Person p = new Person(); 如果通过反射来创建新的实例,可以调用Class提供的newInstance()方法: Person p = Person.class.newInstance(); 调用Class.newInstance()的局限是,它只能调用该类的public无参数构造方法。如果构造方法带有参数,或者不是public,就无法
调用构造方法

获取继承关系

当我们获取到某个Class对象时,实际上就获取到了一个类的类型: Class cls = String.class; // 获取到String的Class 还可以用实例的getClass()方法获取: String s = ""; Class cls = s.getClass(); // s是String,因此获取到String的Class 最后一种获取Class的方法是通过Class.forNa
获取继承关系

动态代理

我们来比较Java的class和interface的区别: 可以实例化class(非abstract); 不能实例化interface。 所有interface类型的变量总是通过某个实例向上转型并赋值给接口类型变量的: CharSequence cs = new StringBuilder(); 有没有可能不编写实现类,直接在运行期创建某个interface的实例呢? 这是可能的,因为Java标准
动态代理

使用注解

什么是注解(Annotation)?注解是放在Java源码的类、方法、字段、参数前的一种特殊“注释”: // this is a component: @Resource("hello") public class Hello { @Inject int n; @PostConstruct public void hello(@Param String name) { System.out.pri
使用注解

定义注解

Java语言使用@interface语法来定义注解(Annotation),它的格式如下: public @interface Report { int type() default 0; String level() default "info"; String value() default ""; } 注解的参数类似无参数方法,可以用default设定一个默认值(强烈推荐)。最常用的参数应当
定义注解

处理注解

ava的注解本身对代码逻辑没有任何影响。根据@Retention的配置: SOURCE类型的注解在编译期就被丢掉了; CLASS类型的注解仅保存在class文件中,它们不会被加载进JVM; RUNTIME类型的注解会被加载进JVM,并且在运行期可以被程序读取。 如何使用注解完全由工具决定。SOURCE类型的注解主要由编译器使用,因此我们一般只使用,不编写。CLASS类型的注解主要由底层工具库使用,
处理注解