java反射
来源:互联网 发布:陈大可的知乎icm 编辑:程序博客网 时间:2024/05/19 17:23
反射
一个java类有多个组成部分,例如:成员变量、构造函数、方法等。反射就是加载类,并解剖出类的各个组成部分
加载类
对于私有的XX,使用getDeclaredXX(….),并且需要加上xx.setAccessible(true);
反射类的构造函数
// 反射构造函数:public Person() @Test public void test1() throws Exception{ Class clazz = Class.forName("com.hcz.reflect.Person"); Constructor<Person> c = clazz.getConstructor(null); Person p = c.newInstance(null); System.out.println(p.getName()); } // 反射构造函数:public Person(String name) @Test public void test2() throws Exception{ Class clazz = Class.forName("com.hcz.reflect.Person"); Constructor<Person> c = clazz.getConstructor(String.class); Person p = c.newInstance("张三"); System.out.println(p.getName()); } // 反射构造函数:private Person(String name,int height) @Test public void test3() throws Exception{ Class clazz = Class.forName("com.hcz.reflect.Person"); Constructor<Person> c = clazz.getDeclaredConstructor(String.class,int.class); c.setAccessible(true);// 暴力反射 Person p = c.newInstance("李四",180); System.out.println(p.getName()+p.getHeight()); } // 反射构造函数:简单方式 无参 @Test public void test4() throws Exception{ Class clazz = Class.forName("com.hcz.reflect.Person"); Person p = (Person) clazz.newInstance(); // 无参构造函数 System.out.println(p.getName()+p.getHeight()); }
反射方法
// 反射方法:public void eat(){ @Test public void test5() throws Exception{ Class clazz = Class.forName("com.hcz.reflect.Person"); Person p = (Person) clazz.newInstance(); Method m = clazz.getMethod("eat"); m.invoke(p); } // 反射方法带参帯返回值:public String eat(String food){ @Test public void test6() throws Exception{ Class clazz = Class.forName("com.hcz.reflect.Person"); Person p = (Person) clazz.newInstance(); Method m = clazz.getMethod("eat", String.class); System.out.println((String) m.invoke(p, "apple")); } // 反射私有方法:private void pee(){ @Test public void test7() throws Exception{ Class clazz = Class.forName("com.hcz.reflect.Person"); Person p = (Person) clazz.newInstance(); Method m = clazz.getDeclaredMethod("pee"); m.setAccessible(true); m.invoke(p); } // 反射静态方法:public static void sleep(){ @Test public void test8() throws Exception{ Class clazz = Class.forName("com.hcz.reflect.Person"); Method m = clazz.getDeclaredMethod("sleep"); m.invoke(null);// 静态方法不需要对象,当然传了对象也是可以的 } // 反射调用main方法 @Test public void test9() throws Exception{ Class clazz = Class.forName("com.hcz.reflect.Person"); Method m = clazz.getMethod("main",String[].class); m.invoke(null, (Object)new String[]{"1"}); }
反射字段
// 反射字段 @Test public void test10() throws Exception{ Class clazz = Class.forName("com.hcz.reflect.Person"); Person p = (Person) clazz.newInstance(); Field f = clazz.getDeclaredField("name"); f.setAccessible(true); Class type = f.getType();// 获取字段的类型 if(type.equals(String.class)){ String name = (String) f.get(p); System.out.println(f.get(p)); } }
阅读全文
0 0
- 【反射】JAVA反射机制
- JAVA 反射
- java 反射
- Java反射
- java反射
- java反射
- JAVA反射
- java 反射
- Java 反射
- java 反射
- Java反射
- java反射
- JAVA 反射
- java 反射
- Java反射
- java反射
- java 反射
- java 反射
- User Thread与Daemon Thread- java
- leetcode | 用拟牛顿法求一个数的平方根 | Python
- android软键盘(一)
- 计算机网络
- PHP 操作文件没有权限:Permission denied
- java反射
- java script
- [Assembly] 程序的机器级表示(二):数据传输指令
- L1-025. 正整数A+B
- codevs 1141 数列(二进制&快速幂)
- Spring TestContext测试框架搭建
- 37 C语言加减乘除运算
- Android7.0完美适配——FileProvider拍照裁剪全解析
- Spring Bean java显式配置类注入Bean