public static void main(String[] args) throws Exception {
// Demo.class
// 如何获取字节码文件对象
// 1.调用.class
Class clzz1 = Demo.class;
// 2.调用forName()方法 类名作为参数
Class clzz2 = Class.forName("com.xxx.反射.Demo");
// 3.通过对象的getClass()方法来获取
Demo it = new Demo();
Class clzz3 = it.getClass();
System.out.println(clzz1);
System.out.println(clzz2);
System.out.println(clzz3);
// 如何获取属性,以及访问属性
Field field = clzz1.getDeclaredField("name");
// 暴力反射
field.setAccessible(true);
field.set(it, "jack");
System.out.println(it.getName());
Field[] fields = clzz1.getDeclaredFields();
// 如何获取方法,以及调用方法
Method method = clzz1.getDeclaredMethod("test", null);
method.invoke(it, null);
Method method2 = clzz1.getDeclaredMethod("test2", String.class,int.class);
method2.invoke(it, "rose",19);
Method method3=clazz.getDeclaredMethod("test3", null);
//暴力执行
method3.setAccessible(true);
method3.invoke(t1, null);
// 如何获取构造方法来创建对象
// 获取空参构造方法,创建对象
Demo it2 = (Demo)clzz1.newInstance();
// 获取有参构造方法,创建对象
Constructor cs = clzz1.getDeclaredConstructor(String.class,int.class);
Demo it3 = (Demo)cs.newInstance("传智播客",11);
System.out.println(it3.getName()+"..."+it3.age);
// 获取Demo类的字节码文件对象
// Class clzz = Demo.class;
//// Demo it = new Demo();
//
// // 获取空参构造方法创建对象
// Demo it = (Demo)clzz.newInstance();
//
//
// Field[] fields = clzz.getDeclaredFields();
// for(Field field : fields) {
//// System.out.println(field.getName());
// if(field.getName().equals("name")) {
// // 暴力访问
// field.setAccessible(true);
// field.set(it, "程序员");
// }
// }
// System.out.println(it.getName());
// Method[] methods = clzz.getDeclaredMethods();
// for(Method method : methods) {
// System.out.println(method.getName());
// if(method.getName().equals("test")) {
// System.out.println("说明有这个方法");
// }
// if(method.getName().equals("test")) {
// method.invoke(it, null);
// }
// if(method.getName().equals("test2")) {
// method.invoke(it, "HelloWorld");
// }
// }
}
反射的基本用法
最新推荐文章于 2024-09-15 21:40:29 发布