一、一切皆对象
java中一切皆对象(静态成员和普通数据类型不是,但是普通数据类型有包装类)
类是java.lang.Class的对象
Class类实例对象:
class Foo{
public static void main(String[] args){
Foo fool1 = new Foo;
//方式1
Class c1 = Foo.class;
//方式2,任何一个类中都有一个静态的Class类的成员变量
Class c2 = fool1.getClass();
//Class是Foo的类类型,fool1是Foo的类对象
//一个类只能是Class的一个示例对象,因此c1 = c2
//方式3,会抛出异常
Class c3 = Class.froName("");
}
}
可以通过类类型创建类对象
//会抛出异常,需要fool有无参数的构造方法
Foo fool2 = (Foo) Class.newInstance();
编译时加载类是静态加载,运行时加载类是动态加载
interface office{
}
class word{
}
class excel{
}
public static void main(String[] args){
Class c = Class.forName(args[0]);
Office a = (Office)c.newInstance();
}
cmd下运行
javac编译
java运行:java filename word
方法是Method的方法
类的成员变量也是对象
封装在java.lang.reflect.Field
用getField()
构造函数也是对象
封装在java.lang.Constructor中
getConstructor()
二、反射
Java 反射机制是在运行状态中,对于任意一个类,都能够获得这个类的所有属性和方法,对于任意一个对象都能够调用它的任意一个属性和方法。这种在运行时动态的获取信息以及动态调用对象的方法的功能称为 Java 的反射机制。
主要通过java.lang.reflect包实现
Method中的invoke()可以得到方法的反射。
eg:public String a (String c,String b){}
Method m = c.getMethod();
Object o = m.invoke("a",string.class,string.class);
反射与泛型。
1.编译后集合是去泛型的。只在编译阶段有效。
2.可以通过方法的反射机制绕过泛型。