Class类
任何一个类都是Class类的实例,而我们常见的对象,是用普通的类实例化出来的,也就是Class类的实例的实例。一个普通的类Foo的Class实例有三种表示方式:
- 1、知道类名获取Foo的Class实例 Class c1 = Foo.class;
- 2、通过Foo对象获得Foo的Class实例 Class c2 = foo.getClass();
- 3、通过forName()获得实例 Class c3 = Class.forName("test.reflect.Foo");
这三者是相等的:
System.out.println(c1 == c2&&c2 == c3);
// True
可以用Class的实例创建Foo的实例:
Foo foo2 = (Foo)c1.newInstance();
动态加载类
1、静态加载类。编译时加载类,在编译时刻就需要加载所有的可能的使用到的类。所有的类都会加载,不管有没有被使用
2、动态加载类。运行时加载类
使用Class.forName()动态加载类
public static void main(String [] args){
try{
Class c = Class.forName(args[0]);
// OfficeUtil 是接口
OfficeUtil obj = (OfficeUtil)c.newInstance();
obj.print();
}
catch(Exception e){
e.printStackTrace();
}
}
使用了OfficeUtil接口的Word类
class Word implements OfficeUtil{
public void print(){
System.out.println("Word");
}
}
使用了OfficeUtil接口的Excel类
class Excel implements OfficeUtil{
public void print(){
System.out.println("Excel");
}
}
OfficeUtil接口
interface OfficeUtil{
public void print();
}
获得类类型的信息
通过Class类的对象获得某个类的信息
- getName() 返回类类型的名称
- getSimpleName() 返回类类型的名称的简写
获得类名:
Class c1 = int.class;
Class c2 = String.class;
Class c3 = void.class;
Class c4 = double.class;
Class c5 = Double.class;
System.out.println(c1.getName());
System.out.println(c2.getName());
System.out.println(c3.getName());
System.out.println(c4.getName());
System.out.println(c5.getName());
结果:
int
java.lang.String
void
double
java.lang.Double
getSimpleName()和getName():
java.lang.String // getName()
String // getSimpleName()
Method对象
方法也是对象,一个成员方法就是一个Method对象实例。method实例有以下常用方法:
- getReturnType() 获得返回值,返回的是 Class
public static void printClassMethodMessage(Object obj){
// 获得对象的类类型
Class data = obj.getClass();
// 获得类类型的名称
System.out.println("类名(getName):"+data.getName());
/**
* Method类,一个成员方法就是一个Method对象实例。方法也是对象
* getDeclaredMethods(); 返回所有方法,但是不包括继承的方法
* getmethods() 返回继承的方法和自己定义的public方法
*/
Method [] methods = data.getMethods();
for(Method temp : methods){
// 获得返回值类型
Class returnType = temp.getReturnType();
System.out.print(returnType.getSimpleName()+" ");
// 获得方法名
System.out.print(temp.getName()+"(");
// 获得参数数组
Class [] params = temp.getParameterTypes();
for(Class param : params){
System.out.print(param.getSimpleName()+",");
}
System.out.println(")");
}
}
测试类:
public static void main(String[] args) {
ClassUtil.printClassMethodMessage("bbb");
}
结果是:
类名(getName):java.lang.String
boolean equals(Object,)
String toString()
int hashCode()
int compareTo(String,)
int compareTo(Object,)
int indexOf(String,int,)
int indexOf(String,)
int indexOf(int,int,)
int indexOf(int,)
String valueOf(int,)
String valueOf(long,)
String valueOf(float,)
String valueOf(boolean,)
String valueOf(char[],)
String valueOf(char[],int,int,)
String valueOf(Object,)
String valueOf(char,)
String valueOf(double,)
...
获得成员变量的信息
Field对象表示成员变量。每一个变量都是一个Field对象
- getFields() 获得public变量。返回Field[]
- getDeclaredFields() 获得所有变量,但不包括继承的变量 。返回Field[]
- getType获得 变量的类型。返回Class
public static void printClassFieldMessage(Object obj){
Class data = obj.getClass();
// 获得所有成员变量
Field [] fields = data.getDeclaredFields();
for(Field field:fields){
System.out.println(field.getType().getName() +" ");
System.out.println(field.getName());
}
}
结果是:
[C
value
int
hash
long
serialVersionUID
[Ljava.io.ObjectStreamField;
serialPersistentFields
java.util.Comparator
CASE_INSENSITIVE_ORDER
获得构造方法
Constructor类的实例化对象,表示构造函数
获得构造函数:
public static void printClassConFieldMessage(Object obj){
Class data = obj.getClass();
// 获得所有的构造函数
Constructor[] cons = data.getConstructors();
for(Constructor con:cons){
// 获得函数名
System.out.print(con.getName()+"(");
// 获得参数列表
Class [] params = con.getParameterTypes();
for(Class param : params){
System.out.print(param.getName()+",");
}
System.out.println(")");
}
}
结果:
java.lang.String([B,int,int,)
java.lang.String([B,java.nio.charset.Charset,)
java.lang.String([B,java.lang.String,)
java.lang.String([B,int,int,java.nio.charset.Charset,)
java.lang.String([B,int,int,java.lang.String,)
java.lang.String(java.lang.StringBuilder,)
java.lang.String(java.lang.StringBuffer,)
java.lang.String([B,)
java.lang.String([I,int,int,)
java.lang.String()
java.lang.String([C,)
java.lang.String(java.lang.String,)
java.lang.String([C,int,int,)
java.lang.String([B,int,)
java.lang.String([B,int,int,int,)