最近学习反射,所以写了一些常用的基本方法防止自己忘记了方便查看,如果哪里写的不对,欢迎各位大神指点~
1,通过反射得到类对象:
public static void main(String[] args) {
// A的实例对象
A a = new A();
/*
* Class类的实例对象三种表达方式
*/
// 第一种表示方式
Class c1 = A.class;
// 第二中表达方式
Class c2 = a.getClass();
// 第三种表达方式
Class c3 = null;
try {
c3 = Class.forName("com.demo.A");// 此处写包名全名
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
// 我们完全可以通过类的类类型创建该类的对象实例---->通过c1 or c2 or c3创建Foo的实例对象
try {
A aa = (A) c1.newInstance();// 需要有无参数的构造方法,不强转会报错
a.println();// 自己写的a的方法
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
2,通过反射得到类的成员方法
Object obj = new Object();//obj就是你要的类型
//要获取类的信息 首先要获取类的类类型
Class c = obj.getClass();//传递的是哪个子类的对象 c就是该子类的类类型
//获取类的名称
System.out.println("类的名称是:"+c.getName());
/*
* Method类,方法对象
* 一个成员方法就是一个Method对象
* getMethods()方法获取的是所有的public的方法,包括父类继承而来的
* getDeclaredMethods()获取的是所有该类自己声明的方法,不问访问权限
*/
Method[] ms = c.getMethods();//c.getDeclaredMethods()
for(int i = 0; i < ms.length;i++){
//得到方法的返回值类型的类类型
Class returnType = ms[i].getReturnType();
System.out.print(returnType.getName()+" ");
//得到方法的名称
System.out.print(ms[i].getName()+"(");
//获取参数类型--->得到的是参数列表的类型的类类型
Class[] paramTypes = ms[i].getParameterTypes();
for (Class class1 : paramTypes) {
System.out.print(class1.getName()+",");
}
System.out.println(")");
3,通过反射得到类的成员变量信息
Object obj = new Object();//obj就是你要的类型
Class c = obj.getClass();
/*
* 成员变量也是对象
* java.lang.reflect.Field
* Field类封装了关于成员变量的操作
* getFields()方法获取的是所有的public的成员变量的信息
* getDeclaredFields获取的是该类自己声明的成员变量的信息
*/
//Field[] fs = c.getFields();
Field[] fs = c.getDeclaredFields();
for (Field field : fs) {
//得到成员变量的类型的类类型
Class fieldType = field.getType();
String typeName = fieldType.getName();
//得到成员变量的名称
String fieldName = field.getName();
System.out.println(typeName+" "+fieldName);
}
4,通过反射得到类的构造方法信息
Object obj = new Object();//obj就是你要的类型
Class c = obj.getClass();
/*
* 构造方法也是对象
* java.lang. Constructor中封装了构造方法的信息
* getConstructors获取所有的public的构造方法
* getDeclaredConstructors得到所有的构造方法
*/
//Constructor[] cs = c.getConstructors();
Constructor[] cs = c.getDeclaredConstructors();
for (Constructor constructor : cs) {
System.out.print(constructor.getName()+"(");
//获取构造方法的参数列表--->得到的是参数列表的类类型
Class[] paramTypes = constructor.getParameterTypes();
for (Class class1 : paramTypes) {
System.out.print(class1.getName()+",");
}
System.out.println(")");
}
5,方法反射的基本操作
public static void main(String[] args) {
A a = new A();
/*
* 要获取print(int ,int )方法 1.要获取一个方法就是获取类的信息,获取类的信息首先要获取类的类类型
*/
Class c = a.getClass();
/*
* 2.获取方法 名称和参数列表来决定 getMethod获取的是public的方法 getDelcaredMethod自己声明的方法
*/
try {
Method m = c.getMethod("print", new Class[] { int.class, int.class });
// Method m = c.getMethod("print", int.class,int.class);也可以这样写,上边那种写法看起来比较清晰
/*
* 方法的反射操作 a1.print(10, 20);方法的反射操作是用m对象来进行方法调用 和a1.print调用的效果完全相同
* 方法如果没有返回值返回null,有返回值返回具体的返回值
*/
Object obj = m.invoke(a, 10, 20);
// 不带参数的操作
System.out.println("===================");
// Method m2 = c.getMethod("print", new Class[]{});
Method m2 = c.getMethod("print");
// m2.invoke(a1, new Object[]{});
m2.invoke(a1);
} catch (Exception e) {
e.printStackTrace();
}
}
}
class A {
public void print() {
System.out.println("helloworld");
}
public void print(int a, int b) {
System.out.println(a + b);
}
public void print(String a, String b) {
System.out.println(a.toUpperCase() + "," + b.toLowerCase());
}