java反射经典总结
1:通过反射解析这个类的构造函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | public class person { public String name= "jack" ; private int password= 123 ; private static int age; public person() { System.out.println( "person" ); } public person(String name) { System.out.println( "person name:" +name); } public person(String name, int age) { System.out.println( "person name:" +name+ "person age:" +age); } private person(List list) { System.out.println( "person list" ); } public void aa() { System.out.println( "aa" ); } public void aa1(String name, int age) { System.out.println( "name:" +name+ "age:" +age); } private void aa2(InputStream inputStream) { System.out.println( "in" ); } public static void aa3( int num) { System.out.println( "aa3" +num); } } |
2:反射这个类的构造函数
//反射类的构造函数,创建类的对象 /* * 反射類的構造方法的目的:創建類的對象,實例化對象 * 1:加載類class.forname * 2:獲取構造函數getConstructor * 3:運行構造方法(實例化)newInstance() */ public class Demo1 { // 反射构造函数 public person() @Test public void test1() throws ClassNotFoundException, SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException { // 先加载类,在获取类的构造函数(构造函数目的就是创建对象),在创建对象 Class c = Class.forName("com.reflction.person"); Constructor constructor = c.getConstructor(null);// 接受可变参数,null表示无参 person person = (com.reflction.person) constructor.newInstance(null); System.out.println(person.name); } // 反射构造函数 public person(String name) @Test public void test2() { try { Class c = Class.forName("com.reflction.person"); Constructor constructor1 = c.getConstructor(String.class); person person1 = (person) constructor1.newInstance("****"); System.out.println(person1.name); } catch (Exception e) { } } // 反射構造函數public person(String name,int age) @Test public void test3() { try { Class c = Class.forName("com.reflction.person"); Constructor constructor3 = c.getConstructor(String.class,int.class); person person3= (person) constructor3.newInstance("jack",23); System.out.println(person3.name); } catch (Exception e) { } } //反射構造函數 private person(List list) @Test public void test4() { try { Class c = Class.forName("com.reflction.person"); Constructor constructor4=c.getDeclaredConstructor(java.util.List.class); //私有的東西外界不能訪問,但反射可以,強制打開 constructor4.setAccessible(true);//暴力反射 ArrayList<String> list=new ArrayList<String>(); list.add("name"); list.add("age"); person person4=(person) constructor4.newInstance(list); System.out.println(person4.name); } catch (Exception e) { } } }
3:反射类的方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | //反射類的方法 /* * 反射類的方法的目的:運行該方法 * 1:加載類的對象Class.forname() * 2:獲取該方法getMethod,getDeclaredMethod() * 3:運行該方法invoke(); */ public class Demo2{ //反射類的public void aa() @Test public void test1() { try { person person= new person(); //加載類 Class c = Class.forName( "com.reflction.person" ); //獲取方法 Method method=c.getMethod( "aa" , null ); //第一個參數那個方法,第二個參數 //讓方法運行 method.invoke(person, null ); //讓那個對象運行 //比如:上廁所方法,肯定要誰去上廁所,要傳個person對象 } catch (Exception e) { } } //反射這個方法public void aa1(String name,int age) @Test public void test2() { try { person person= new person(); Class c = Class.forName( "com.reflction.person" ); Method method=c.getMethod( "aa1" ,String. class , int . class ); method.invoke(person, "jack" , 23 ); } catch (Exception e) { } } //反射這個方法private void aa2(InputStream inputStream) @Test public void test3() { try { person person= new person(); Class c = Class.forName( "com.reflction.person" ); Method method=c.getDeclaredMethod( "aa2" ,InputStream. class ); //private method.setAccessible( true ); //暴力打開,沒有這句話的話private不能訪問 method.invoke(person, new FileInputStream( "F:\\1.txt" )); } catch (Exception e) { } } //反射public static void aa3(int num) @Test public void test4() throws Exception { person person= new person(); Class c = Class.forName( "com.reflction.person" ); Method method=c.getMethod( "aa3" , int . class ); method.invoke( null , 23 ); //static 方法不用傳入對象,當然也可以傳入 } } |
3:反射类的字段
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | //反射字段 /* * 反射字段目的:獲取字段的值,或者為字段賦值封裝數據 * 1:加載類 * 2:獲取字段 * 3:取得那個字段的值 */ //public String n public class Demo3 { @Test public void test1() throws Exception { person person= new person(); //加載類 Class c = Class.forName( "com.reflction.person" ); //獲取字段 Field field=c.getField( "name" ); //獲取那個對象的字段,取字段的值 System.out.println(field.get(person)); //當然也可以設置字段的值 field.set(person, "xiaoli" ); System.out.println(person.name); } //反射字段 private int password=123; @Test public void test2() throws Exception { person person= new person(); Class c = Class.forName( "com.reflction.person" ); Field field=c.getDeclaredField( "password" ); field.setAccessible( true ); //暴力打開private System.out.println(field.get(person)); field.set(person, 456 ); System.out.println(field.get(person)); } } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 【非技术】说说2024年我都干了些啥