Class类

除了int等基本类型外,Java的其他类型全部都是class(包括interface)。例如: String Object Runnable Exception ... 仔细思考,我们可以得出结论:class(包括interface)的本质是数据类型(Type)。无继承关系的数据类型无法赋值: Number n = new Double(123.456); // OK String s = new
Class类

访问字段

对任意的一个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标准
动态代理