------- android培训、java培训、期待与您交流! ----------
获取某个类的Class对象的三种方式:
方式一:调用对象的getClass()方法。它是Object类中的方法。
此方法是普通方法,不是静态的,要通过类的对象的引用去调用。
Student stu = new Studetn();
Class stuClass = stu.getClass();
方式二:任何的"数据类型"都有一个"静态的属性"--class属性,这个属性可以
获取这个类的Class对象
方式三:调用Class类中的静态方法forName()可以获取某个类的Class对象;(常用方式)
public static Class forName(String className)
通过这个Class对象,我们可以:
1.获取并调用这个类的所有的构造方法:
批量获取
1.public Constructor[] getConstructors():获取所有公共构造方法
2.public Constructor[] getDeclaredConstructors():获取所有构造方法。包括公有,受保护,默认,私有
获取单个的构造方法:
1.public Constructor getConstructor(Class... parameterTypes):获取类中的指定的"公有构造方法"。
参数:parameterTypes:构造方法形参的类型的Class
2.public Constructor getDeclaredConstructor(Class...parameterTypes):获取类中的任何的构造方法,包括私有的
调用构造方法:通过Constructor去调用。使用方法:public T newInstance(Object... initargs)
通过Class对象获取成员属性,并调用:
*
批量获取:
1.Field[] getFields() :所用"公有"的成员属性
2.Field[] getDeclaredFields() :所有的成员属性,包括私有的:
获取单个的属性
1.Field getField(String fieldName):获取单个的,公有的成员属性
2.Field getDeclaredField(String fieldName):获取单个的成员属性,可以是任何的访问级别
通过Class对象获取某个类的成员方法并调用:
批量获取:
1.Method[] getMethods() :获取所有的"公有"方法;
2.Method[] getDeclaredMethods() :获取所有方法,包括私有的。
获取单个的:
1.Method getMethod(String name, Class<?>... parameterTypes) :获取某个公有的方法。
形参:name:方法名;
parameterTypes:形参的类型列表;
2.Method getDeclaredMethod(String name, Class<?>... parameterTypes):获取某个方法。可以是私有的。
以下为案例代码:
首先创建一个被调用的类生成class文件:
public class Student {
//********一些构造方法***********//
//公有的
public Student(){
System.out.println("调用了公有的,无参的构造方法");
}
public Student(boolean b){
System.out.println("调用了公有的,带参的构造方法。b = " + b);
}
//受保护的
protected Student(int n){
System.out.println("调用了受保护的构造方法 n = " + n);
}
//默认的
Student(String s){
System.out.println("调用了默认的构造方法。s = " + s);
}
//私有的
private Student(char c){
System.out.println("调用了私有的构造方法。c = " + c);
}
//*****************成员属性***************//
public String stuName;
protected int age;
char sex;
private String address;
//*****************成员方法*******************//
public void show(){
System.out.println("调用了公有,无参的show()方法");
}
protected void show(String s){
System.out.println("调用了受保护的,带参的show()方法。参数s = " + s);
}
void show(int n){
System.out.println("调用了默认的,带参的show()方法。参数n = " + n);
}
private int show(char c){
System.out.println("调用了私有的,带参的带返回值的show()方法。参数c = " + c);
return 10 + 20;
}
}
然后再main方法中实现:
public static void main(String[] args) throws Exception {
//三种创建class类的方法
Student stu=new Student();
Class c1=stu.getClass();
Class c2=Student.class;
Class c3=null;
try {
c3=Class.forName("cn.wxw.反射.Student");
} catch (ClassNotFoundException e) {
}
//获取class文件中的所有构造方法
Constructor[] g1=c3.getDeclaredConstructors();
for(Constructor c:g1){
System.out.println(c);
}
System.out.println("------------------------");
//获取所有的 公有 狗仔方法
Constructor[] g2=c3.getConstructors();
for(Constructor c:g2){
System.out.println(c);
}
System.out.println("------------------------");
//获取单个公共构造方法
Constructor g3=c3.getConstructor();
System.out.println(g3);
g3=c3.getConstructor(boolean.class );
System.out.println(g3);
System.out.println("------------------------");
//获取一个任类型构造方法
Constructor g4=c3.getDeclaredConstructor(char.class);
System.out.println(g4);
System.out.println("------------------------");
//以下是获取字段
//获取所有字段
Field[] f1=c3.getDeclaredFields();
for(Field f:f1){
System.out.println(f);
}
System.out.println("------------------------");
//获取公有字段
Field[] f2=c3.getFields();
for(Field f:f2){
System.out.println(f);
}
System.out.println("------------------------");
//获取指定公有字段
Field f3=c3.getField("stuName");
System.out.println(f3);
System.out.println("------------------------");
//获取指定字段
Field f4=c3.getDeclaredField("address");
System.out.println(f4);
//下面是获取成员方法 也分为4种
System.out.println("*************************************获取所有\"公有\"的成员方法**********************************");
Method[] methodArray = c3.getMethods();//包含了父类的方法
for(Method m : methodArray){
System.out.println(m);
}
System.out.println("*************************************获取所有的成员方法,包括私有的**********************************");
Method[] methodArray2 = c3.getDeclaredMethods();//不包含父类的。
for(Method m : methodArray2){
System.out.println(m);
}
System.out.println("*************************************获取单个\"公有\"的\"无参\"的成员方法**********************************");
Method m1 = c3.getMethod("show");
System.out.println(m1);
System.out.println("*************************************获取单个\"私有\"的\"带参\"的成员方法**********************************");
Method m2 = c3.getDeclaredMethod("show", char.class);
System.out.println(m2);
}