Class类是反射机制中非常重要的类,得到Class类的三种方法:
-
Class.forName(类名)
-
类名.Class
-
实例.getClass()
代码如下
public class ClassTest {
/**
* @param args
*/
public static void main(String[] args) {
try {
Class a=Class.forName("B");
A a1=(A)a.newInstance();
a1.f();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// TODO Auto-generated method stub
}
}
class A{
public void f(){
System.out.println("Class A");
}
}
class B extends A{
public void f(){
System.out.println("Class B");
}
}
但是如果该类构造函数不是默认无参数的,则必须获得这个构造器,如还用上述代码则会报InstantiationException异常。带参的构造如下
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class ClassTest {
/**
* @param args
*/
public static void main(String[] args) {
try {
Class a=Class.forName("B");
Method[] m=a.getMethods();
Constructor[] cn=a.getConstructors();
Field[] f=a.getFields();
Constructor cons=B.class.getConstructor(int.class);
A a1=(A) cons.newInstance(1);
a1.f();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// TODO Auto-generated method stub
}
}
class A{
int i;
public A(int i){
this.i=i;
}
public void f(){
System.out.println("Class A");
}
}
class B extends A{
public B(int i) {
super(i);
// TODO Auto-generated constructor stub
}
public void f(){
System.out.println("Class B");
}
}
Class类还有其他方法:得到成员变量、得到方法、得到构造方法
Method[] m=a.getMethods();
Constructor[] cn=a.getConstructors();
Field[] f=a.getFields();
Java创建对象的方法:
- 通过new来创建
- 通过反射机制的Class
- 通过clone()方法
- 通过反序列化方式