目录
- Class类的使用
- 方法的反射
- 成员变量的反射
- 构造函数的反射
- Java类加载机制
java通常是先有类再有对象,有对象我就可以调用方法或者属性。反射其实是通过Class对象来调用类里面的方法。通过反射可以调用私有方法和私有属性。大部分框架都是运用反射原理
一.Class类的使用
public class ClassDemo1{
public static void main(String[] args){
Foo f1 = new Foo();
Class c1 = Foo.class;
Class c2 = f1.getClass();
Class c3 = Class.forname(包名+类名);
try{
Foo foo = (Foo)c1.newInstance();
foo.print();
}catch{
}
}
class Foo{
void print(){}
}
}
二.Java动态加载类
- Java类的静态加载是在编译时加载
- Java类的动态加载是在运行时加载
public interface OfficeAble{
public void start();
}
public Word implements OfficeAble{
public void start(){
System.out.print("word.....");
}
}
public Excel implements OfficeAble{
public void start(){
System.out.print("word");
}
}
public class OfficeBetter{
public static void main(String[] args){
Class c1 = OfficeBetter.forName("");
OfficeAble oa = c1.newInstance();
oa.start();
}
}
三.获取到方法信息
public class ClassUtil{
/**
*打印类的信息,包括类的成员函数、成员函数
*/
public static void printClassMessage(Object obj){
Class c = obj.getClass();
System.out.println("类的名称"+c.getName());
Method[] ms = c.getMethod();
for(int i=0;i<ms.lenght;i++){
Class returnType = ms[i].getReturnType();
System.out.print(returnType.getName()+"");
System.out.print(ms[i].getName()+"(");
Class[] paramTypes = ms[i].getParammeterTypes();
for(Class class1 : paramTypes){
System.out.print(class1.getName+",");
}
System.out.print(")");
}
}
}
四.获取成员变量的所有信息
private static void printFiledMessage(Object obj){
/**
*成员变量也是一个对象
*java.lang.reflect.Filed
*Filed类封装了关于成员变量的操作
*getFileds()方法获取的是所有的public的成员变量的信息
*getDeclaredFileds()获取的是该类自己声明的成员变量的信息
*/
Filed[] fs = c.getDeclareFileds();
for(Filed filed:fs){
Class filedType = filed.getType();
String typeName = filedType.getName();
String filedName = filed.getName();
System.out.ptintln(typeName+" "+filedName);
}
}
五.获取构造的信息
public static void printConMessage(Object obj){
Class c = obj.getClass();
/**
*构造函数也是对象
*java.lang.Constructor中封装构造函数的信息
*getConstructor获取所有的public构造函数
*getDeclaredConstrutors得到所有的构造函数
*/
Contructor[] cs = c.getDeclaredContructor);
for(Constructor constructor:cs){
System.out.print(constructor.getName()+"(");
Class[] paramTypes = constructor.getParameterTypes();
for(Class class1 : paramTypes){
System.out.println(class1.getName()+",");
}
}
}