package seday18c;
import java.lang.reflect.Method;
/**
* java反射机制
* java反射机制是一种动态机制,它允许我们加载一个类实例化一个类,调用方法或操作属性从编码期间确定转为在运行期间确定。
* 这样做可以大大提高代码的灵活度,但是反射有更大的资源开销。所以不能过度依赖反射。
*/
public class ReflectDemo1 {
public static void main(String[] args) {
/*
* Class类
* Class类的每一个实例用于表示JVM已经加载的一个类。并且在JVM内部每个被加载的类都有且只有一个Class的实例与之对应。
* 通过类对象我们可以:
* 获取其表示的类的名字,构造方法,方法,属性,并可以快速实例化。
* 获取一个类的类对象有以下方式:
* 1:直接通过类的静态属性class得到。比如像获取String的类对象,可以: Class cls = String.class;
* 2:通过Class的静态方法forName加载:Class cls = Class.forName("java.lang.String");
* 3:通过类加载器ClassLoader
*/
try {
//方式一:直接通过类的静态属性class得到
Class clss = Integer.class;
String names=clss.getName();//获取类名
System.out.println(names);//打印名称
Method [] method1=clss.getDeclaredMethods();//获取本类定义的方法(不含超类继承的方法)
System.out.println(method1.length);//长度
//遍历
for(Method method2 : method1) {
System.out.println(method2.getName());//打印
}
System.out.println("----------------------------------");//打印分割线
//方式二:通过Class的静态方法forName加载Integer
Class cls =Class.forName("java.lang.Integer");
String name=cls.getName();//获取类名
System.out.println(name);
//获取所有方法(含从超类继承的方法)
//Method[] methods = cls.getMethods();
//获取本类定义的方法(不含超类继承的方法)
Method [] methods=cls.getDeclaredMethods();
//长度
System.out.println(methods.length);
//遍历
for(Method method : methods) {
System.out.println(method.getName());
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}