反射是一种新的操作类中属性、构造方法和普通方法的机制
创建一个Student类
package venus;
public class Student {
public static String name;
public Student(){
}
private Student(String name){
this.name = name;
}
public static int doHomework() {
System.out.println(name+"正在做作业");
return 1;
}
}
获取Class对象
1、构造方法,Class.forName()
Class clazz = null;
try {
clazz = Class.forName("venus.Student");
System.out.println(clazz.getName());
}catch (ClassNotFoundException e){
e.printStackTrace();
}
输出对象名venus.Student。
2、构造方法,类名.class
clazz = Student.class;
System.out.println(clazz.getName());
输出对象名venus.Student。
3、构造方法,对象.getClass()
clazz = new Student().getClass();
System.out.println(clazz.getName());
输出对象名venus.Student。
4、基本数据类型对应的class对象:包装类.TYPE
clazz = Integer.TYPE;
System.out.println(clazz.getName());
输出int。
5、数组类型对应class:元素类型[].class
clazz = String[].class;
System.out.println(clazz.getName());
输出[Ljava.lang.String;
6、某个类父类所对应的class对象
clazz = Student.class.getSuperclass();
System.out.println(clazz.getName());
输出Student的父类java.lang.Object
7、获取某个类对应的Class对象
分为只能是public方法和不区分访问权限方法两种情况
clazz = Student.class;
//public方法
try{
Constructor constructor = clazz.getConstructor();
System.out.println(constructor.getName());
}catch (Exception e){
e.printStackTrace();
}
//不区分访问权限
try{
Constructor constructor = clazz.getDeclaredConstructor(String.class);
System.out.println(constructor.getName());
}catch (Exception e){
e.printStackTrace();
}
获取构造方法
1、获取构造方法信息
Constructor constructor = clazz.getDeclaredConstructor(String.class);
clazz = constructor.getDeclaringClass();//获取是哪个类中的构造方法
System.out.println(clazz.getName());
int mod = constructor.getModifiers();
String result = Modifier.toString(mod);//获取方法访问权限
System.out.println(result);
System.out.println(constructor.getName());//获取构造方法名
Class [] clazzs = constructor.getParameterTypes();//获取参数列表
for (Class zz: clazzs) {
System.out.println(zz.getName());
}
输出:
venus.Student
private
venus.Student
java.lang.String
2、使用构造方法
constructor.setAccessible(true);//若构造方法为非public先设置可访问
Object object = constructor.newInstance("Tom");
Student stu = (Student)object;
stu.doHomework();
即可输出Tom正在做作业。
如何操作类属性
1、如何获取
a.public方法,不仅包含本类的方法,还包括继承自父类的public方法
获取方法数组:
Method [] methods = clazz.getMethods();
for (Method method: methods) {
System.out.println(method.getName());
}
输出:
doHomework
wait
wait
wait
equals
toString
hashCode
getClass
notify
notifyAll
不仅包括本类中定义的doHomework方法,还包括其父类中equals等方法。
获取某个方法:
try {
Method method = clazz.getMethod("doHomework");//只能获取public方法
System.out.println(method);
}catch (Exception e){
e.printStackTrace();
}
输出:
public static int venus.Student.doHomework()。
b、本类中声明的方法,不包含父类
Method [] methodss = clazz.getDeclaredMethods();
for (Method method: methodss) {
System.out.println(method.getName());
}
只输出doHomework。
2、获取信息
Method method = clazz.getMethod("doHomework");//只能获取public方法 getMethod(name,Parameters)
System.out.println(method.getDeclaringClass());//获取在哪个类中声明
System.out.println(Modifier.toString(method.getModifiers()));//获取修饰符
System.out.println(method.getReturnType().getName());//获取返回值类型
System.out.println(method.getName());//获取方法名
Class [] clazzs = method.getParameterTypes();//获取参数列表
3、如何使用
反射中方法不区分静态与非静态
method.setAccessible(true);//若为非public先设置可访问
Object object = method.invoke(new Student());
System.out.println(object);