- 每个类都有Class对象。
- 获取Class对象的方式有:
类名.class
对象.getClass()
Class.forName("类名")
- Class的方法有:
-
getName()
:返回类名。
-
getSimpleName()
:返回类名。
-
getCanonicalName()
:返回类名。
-
isInterface()
:判断是否为接口。
-
getInterfaces()
:返回该类的所有接口的Class对象。
-
isInstance(obj)
:接受一个参数,判断是否是obj类对象。
-
isAssignableFrom(cls)
:接受一个Class类型参数,检查是否能用cls赋值。
-
getSuperclass()
:返回基类的Class对象。
-
newInstance()
:创建Class对应的对象,但此对象的类型为Object(除非把Class具体化,如Class<A>,这时会返回A类型对象),此类必须具有默认构造器。
-
getMethods()
:获取此Class对象记录的类的所有公共方法,返回Method对象数组。
-
getConstructors()
:获取此Class对象记录的类的所有构造器,返回Constructor对象数组。
-
cast()
:转型。
- 向下类型转换的询问操作:
if(X instanceof Dog)
代表询问X是否是Dog类型。
- Method:方法对象,可以用Class对象获取。
- Constructor:构造器对象,可以用Class对象获取。
动态代理
class Proxyer implements InvocationHandler {
private Object obj;
Proxyer(Object obj) {
this.obj = obj;
}
// 重新实现InvocationHandler以完成代理,参数为:对象,方法,参数
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 此处进行需要代理的工作
return method.invoke(obj, args);
}
}
interface I {
void doSomething();
}
class A implements I {
public void doSomething() {
System.out.println("doSomething");
}
}
class SimpleDynamicProxy {
public static void main(String[] args) {
// 载入接口加载器,接口的Class对象数组,代理类对象
I proxy = (I) Proxy.newProxyInstance(
I.class.getClassLoader(),
new Class[]{I.class},
new Proxyer(new A()));
proxy.doSomething();
}
}