Class cls = Class.forName("reflect.Person");
//获取类的完全限定名
String name = cls.getName();
System.out.println(name);
//仅获取类名
name = cls.getSimpleName();
System.out.println(name);
//获取当前类对象所表示的类的所有公开方法
Method[] methods = cls.getMethods();
//newInstance()方法会调用类对象所表示的类的【公开的无参构造器】实例化
Object obj = cls.newInstance();//new Person();
/*Constructor 构造器对象
该类的每一个实例用于表示一个类中的某个构造器
*/
//getConstructor(参数类型.class)让构造器传递参数
// newInstance(参数)方法会调用类对象所表示的类的【公开的有参构造器】实例化
Constructor con = cls.getConstructor(String.class,int.class);
Object obj1 = con.newInstance("张三",33);
//调用私有声明的构造器(当然前提是使用setAccessible进行破坏)
Constructor con1 = cls.getDeclaredConstructor();
con1.setAccessible(true);//setAccessible进行破坏私有
Object obj2 = con1.newInstance();
//Method method = cls.getMethod("方法名");//获取名为的无参方法 调用无参方法
Method m = cls.getMethod("eat");//eat()
m.invoke(obj);//执行方法 obj.方法名()
//Method method = cls.getMethod("方法名",参数类型.class) 调用有参方法
Method m1 = cls.getMethod("say",String.class);//say(String)
//invoke方法第二个参数开始为调用方法时传递的实际参数
m.invoke(obj,"大家好!");
//获取类中的私有方法并破坏后开始调用
Method m2 = cls.getDeclaredMethod("hehe");
m2.setAccessible(true);
m2.invoke(obj);
m2.setAccessible(false);//关闭破坏 保证安全私有化
//面对单例时 如果想跳过单例的只创建一个对象的特性
Class c = Class.forName("reflect.Singleton");
//1 获取单例类中的私有构造器
Constructor constructor = c.getDeclaredConstructor();
//2 将其破坏
constructor.setAccessible(true);
//3 利用方法进行实例化 即可创建多个Singleton的对象
Object o = constructor.newInstance();
System.out.println(o);
//类名.class.getResource(".")表示的就是该类(字节码文件)所在的目录
File dir = new File(reflectApi.class.getResource(".").toURI());
String dirName = dir.getName();
//因为Singleton中的构造方法为私有化这里我们利用构造器找到并排除
Constructor con2 = cls.getDeclaredConstructor();
//判断构造器是否时私有化 构造器对象.getModifiers()
// int类型的 Modifier.PRIVATE/PUBLIC
if (con.getModifiers()== Modifier.PRIVATE){}
//Method类提供了方法:int getParameterCount()可以获取其表示的方法的参数个数
int count = m1.getParameterCount();
System.out.println("m1方法的参数个数为:"+count);
//String类型中的方法
// substring(int start,int end)含头不含尾 对字符串进行拆解
// indexOf("str") 按照对应字符串获取其在字符串中的位置
String line = "Person.class";
System.out.println(line);
line = line.substring(0,line.indexOf("."));
System.out.println(line);
反射(reflect)Class类的Api运用
最新推荐文章于 2023-12-13 22:31:02 发布