1 package it.cn.source.reflect; 2 3 import java.lang.reflect.Constructor; 4 import java.lang.reflect.Field; 5 import java.lang.reflect.Method; 6 7 /** 8 * 该类是用于验证反射概念以及用法: 9 * 1.获取字节码文件对象--通过全限定名 10 * 2.通过字节码文件对象获取构造方法 11 * 3.通过字节码文件对象获取普通方法 12 * 4.同过字节码文件对象获取字段 13 * 私有化字段,先调用方法破坏其封装 14 * 然后赋值,取值 15 * @author Administrator 16 * 17 */ 18 public class RefeletTest { 19 20 public static void main(String[] args) throws Exception { 21 //1.获取字节码文件 22 Class<?> clazz = Class.forName("it.cn.source.reflect.A");//完全限定路径名 23 //2.通过当前字节码对象,获取构造方法 24 // Constructor<?>[] constructors = clazz.getConstructors();//只能获取所以public修饰的构造方法 25 // for (Constructor<?> constructor : constructors) {//用增强for循环遍历 26 // System.out.println("public修饰的 --:"+constructor); 27 // } 28 // Constructor<?>[] constructors2 = clazz.getDeclaredConstructors();//获取所以修饰权限的构造方法 29 // for (Constructor<?> constructor1 : constructors2) { 30 // System.out.println("所以修饰权限的构造方法 : " +constructor1); 31 // } 32 //3.通过当前字节码文件对象,获取制定某一个构造方法(也就是根据参数) 33 Constructor<?> declaredConstructor = clazz.getDeclaredConstructor(int.class,String.class); 34 System.out.println(declaredConstructor); 35 //执行该方法,创建一个对象,用Constructor中的方法 newInstance() 36 Object instance = declaredConstructor.newInstance(3,""); 37 //4.通过当前字节码文件对象,获取普通方法 38 Method method = clazz.getDeclaredMethod("test",int.class);//根据方法名和方法的形参获取当前方法对象 39 method.invoke(instance, 3);//因为该方法是实例方法,所以只能用对象调用,需要在第一个参数位置,将上面的instance传入 40 41 Method method1 = clazz.getDeclaredMethod("test",int.class,int.class);//根据方法名和方法的形参获取当前方法对象 42 method1.invoke(null, 3,5);//该方法是static方法,所以需要在第一个参数位置写null,因为不需要对象调用 43 44 //5.通过当前字节码文件对象,获取字段 45 Field field = clazz.getDeclaredField("a");//该字段是private修饰的,所以不能直接赋值取值 46 //首先要破坏其封装性 47 field.setAccessible(true);//true:表示破坏封装,false表示不破坏,默认是false 48 //破坏之后给字段赋值,该字段是没用static修饰的,所以需要一个对象 49 field.set(instance, 3);//3是实际参数 50 //然后取值,该字段没有static修饰,所以需要一个对象 51 Object object = field.get(instance); 52 System.out.println(object); 53 //获取全限定名 54 String name = clazz.getName(); 55 System.out.println("全限定名为: " + name); 56 //获取类名简称 57 String simpleName = clazz.getSimpleName(); 58 System.out.println("类名简称 :" +simpleName); 59 } 60 61 } 62 class A{ 63 private int a = 1; 64 public String str; 65 boolean b = false; 66 67 private A(){ 68 System.out.println("私有无参构造!"); 69 } 70 A(int a){ 71 System.out.println("默认有一个参数!"); 72 } 73 public A(String str){ 74 System.out.println("私有有一个参数!"); 75 } 76 public A(int a,String str){ 77 System.out.println("public两个参数"); 78 } 79 private void test(){ 80 81 } 82 void test(int a){ 83 84 } 85 public static int test(int a,int b){ 86 return a+b; 87 } 88 public String test(String str){ 89 return null; 90 } 91 }
标签:11,String,int,28,System,2022,println,public,out From: https://www.cnblogs.com/puwei520/p/16932876.html