java反射实例
2015-06-08 21:45
381 查看
一、定义类
package aa; import java.util.Date; public class Person { public String name="啦啦啦"; private int age = 18; public static Date time; public int getAge() { return age; } public Person(){ System.out.println("默认构造方法"); } public Person(String name){ System.out.println("姓名:"+name); } public Person(String name,int age){ System.out.println(name+"---"+age); } private Person(int age){ System.out.println("年龄"+age); } public void m1(){ System.out.println("调用了m1方法。。"); } public void m2(String name){ System.out.println("调用了m2方法。。"+name); } public String m3(String name,int age){ System.out.println("调用了m3方法。。"+name+"---"+age); return "aaaaa"; } private void m4(Date d){ System.out.println(d); } public static void m5(){ System.out.println("m5"); } public static void m6(String[] strs){ System.out.println("m6 "+strs.length); } public static void main(String[] strs){ System.out.println("main"); } }
二、反射构造方法
package aa; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.Date; import org.junit.Test; //反射 @SuppressWarnings(value="all") public class Demo3 { //-----反射构造方法----- @Test //public Person(){ public void test01() throws Exception { //1. Class clazz = Class.forName("aa.Person"); //获取类的字节码 // Person p = new Person(); //2.Class clazz = p.getClass(); //3.Class clazz = Person.class; Constructor c = clazz.getConstructor(null); //构造方法的参数 c.newInstance(null); } @Test //public Person(String name){ public void test02() throws Exception { Class clazz = Class.forName("aa.Person"); Constructor c = clazz.getConstructor(String.class); c.newInstance("李四"); } @Test //public Person(String name,int age) public void test03() throws Exception { Class clazz = Class.forName("aa.Person"); Constructor c = clazz.getConstructor(String.class,int.class); c.newInstance("李四",25); Person p = (Person)c.newInstance("李四",25); System.out.println(p.name); } @Test //private Person(int age){ public void test04() throws Exception { Class clazz = Class.forName("aa.Person"); Constructor c = clazz.getDeclaredConstructor(int.class); c.setAccessible(true); //暴力反射 c.newInstance(25); } @Test public void test05() throws Exception { Class clazz = Class.forName("aa.Person"); Constructor[] cs = clazz.getDeclaredConstructors(); //遍历所有构造方法 for(Constructor c:cs){ System.out.println(c); } System.out.println("构造方法的个数: "+cs.length); } @Test public void test06() throws Exception { Class clazz = Class.forName("aa.Person"); Person p =(Person) clazz.newInstance();//默认构造方法 System.out.println(p.name); } //---------以上是反射构造方法---------------
三、反射方法
//---------以下是反射方法------------------ @Test //public void m1() public void test10() throws Exception { Class clazz = Class.forName("aa.Person"); Person p = (Person)clazz.newInstance(); Method m = clazz.getMethod("m1", null);//方法的名称,方法的参数 m.invoke(p, null); //参数一:对象 ,参数二:参数 } @Test //public void m2(String name) public void test11() throws Exception { Class clazz = Class.forName("aa.Person"); Person p = (Person)clazz.newInstance(); Method m = clazz.getMethod("m2", String.class);//方法的名称,方法的参数类型 m.invoke(p, "张三"); //参数一:对象 ,参数二:参数 } @Test //public String m3(String name,int age){ public void test12() throws Exception { Class clazz = Class.forName("aa.Person"); Person p = (Person)clazz.newInstance(); Method m = clazz.getMethod("m3", String.class,int.class); String value = (String)m.invoke(p, "张三",20); System.out.println(value); } @Test //private void m4(Date d){ public void test13() throws Exception { Class clazz = Class.forName("aa.Person"); Person p = (Person)clazz.newInstance(); Method m = clazz.getDeclaredMethod("m4", Date.class); m.setAccessible(true); m.invoke(p, new Date()); } @Test //public static void m5(){ public void test15() throws Exception { //方法一: // Class clazz = Class.forName("aa.Person"); // Person p = (Person)clazz.newInstance(); // Method m = clazz.getMethod("m5",null); // m.invoke(p, null); //方法二: Class clazz = Class.forName("aa.Person"); Method m = clazz.getMethod("m5",null); m.invoke(null, null); } @Test //public static void m6(String[] strs){ public void test16() throws Exception { //方法一: Class clazz = Class.forName("aa.Person"); Person p = (Person)clazz.newInstance(); Method m = clazz.getDeclaredMethod("m6",String[].class); m.setAccessible(true); // m.invoke(null, new Object[]{new String[]{"1","2"}}); //以下两个都可以 // m.invoke(null, (Object)new String[]{"1","2"}); m.invoke(null, new String[]{"1","2"}); // java.lang.IllegalArgumentException: wrong number of arguments }
这个比较重要:
如果在test16方法里直接调用这行代码就会
m.invoke(null, new String[]{“1”,”2”});出现如图所示的错误
@Test //public static void main(String[] strs){ public void test17() throws Exception { Class clazz = Class.forName("aa.Person"); Person p = (Person)clazz.newInstance(); Method m = clazz.getMethod("main",String[].class); m.invoke(null, new Object[]{new String[]{"1","2"}}); }
四、反射字段
//---------以下是反射字段------------ @Test //public String name="传智博客"; public void test20() throws Exception { Class clazz = Person.class; Person p = (Person)clazz.newInstance(); Field f = clazz.getField("name"); String s = (String)f.get(p); System.out.println(s); f.set(p,"上海传智"); System.out.println(p.name); } @Test //private int age = 18; public void test21() throws Exception { Class clazz = Person.class; Person p = (Person) clazz.newInstance(); Field f = clazz.getDeclaredField("age"); f.setAccessible(true); int age = (Integer)f.get(p); System.out.println(age); f.set(p,20); age = (Integer)f.get(p); System.out.println(age); } @Test //public static Date time; public void test22() throws Exception { Class clazz = Person.class; Field f = clazz.getField("time"); f.set(null, new Date()); System.out.println(Person.time); }
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树
- [原创]java局域网聊天系统