Java中反射及动态编译
2017-08-12 17:54
423 查看
1.先写个Users类,然后通过反射,操作这个类
2.通过反射来操作构造器,方法等等
3.Java中动态编译
package tk.javazhangwei.testReflection; public class Users { private int id; private int age; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Users(int id, int age, String name) { super(); this.id = id; this.age = age; this.name = name; } public Users() { // TODO Auto-generated constructor stub } }
2.通过反射来操作构造器,方法等等
package tk.javazhangwei.testReflection; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; /*** * 通过反射动态的api,操作构造器 方法 属性 * @author zw * */ public class Demo02 { public static void main(String[] args) throws InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException, NoSuchFieldException { String path ="tk.javazhangwei.testReflection.Users"; try { Class<Users> clazz = (Class<Users>)Class.forName(path); Users u = clazz.newInstance(); Constructor<Users> u1= clazz.getDeclaredConstructor(int.class,int.class,String.class); Users u2 = u1.newInstance(1001,18,"张伟"); System.out.println(u2.getName()); //通过反射Api,调用普通方法 Users u3 = clazz.newInstance(); //u3.setName("老宋"); Method method = clazz.getDeclaredMethod("setName", String.class); method.invoke(u3, "老王");//相当于u3.setName(); System.out.println(u3.getName()); //通过反射操作属性 Users u4 = clazz.newInstance(); Field f = clazz.getDeclaredField("name"); f.setAccessible(true);//这个属性不需要做安全检查了 直接访问 f.set(u4, "老宋");//通过反射写属性 System.out.println(u4.getName()); System.out.println(f.get(u4)); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
3.Java中动态编译
package tk.javazhangwei.testDynamicCompile; import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.net.URL; import java.net.URLClassLoader; import javax.tools.JavaCompiler; import javax.tools.ToolProvider; /*** * 动态编译java 并且运行 * @author zw * */ public class Demo01 { public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException, InvocationTargetException { String msg ="public class msg{public static void main(String[] args){System.out.println(\"nishizhu\");}}"; File f = new File("d:/mycode/test/msg.java"); OutputStream os = new FileOutputStream(f); byte[] data = msg.getBytes(); os.write(data, 0, data.length); os.flush(); System.out.println("写入文件成功~"); os.close(); JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); int result = compiler.run(null, null, null, "d:/mycode/test/msg.java"); System.out.println(result==0?"编译成功":"编译失败 "); //常规方法 /*Runtime run =Runtime.getRuntime(); Process process =run.exec("java -cp d:/mycode/test/ msg"); InputStream is = process.getInputStream(); BufferedReader bw = new BufferedReader(new InputStreamReader(is)); String info = ""; while((info=bw.readLine())!=null) { System.out.println("编译结果"+info); } is.close();*/ // URL[] urls = new URL[] {new URL("file:/"+"d:/mycode/test/")}; URLClassLoader loader = new URLClassLoader(urls); Class c =loader.loadClass("msg"); Method m =c.getMethod("main", String[].class); m.invoke(null, (Object)new String[] {}); } }
相关文章推荐
- 动态编译_DynamicCompile、反射调用main方法问题JAVA214
- JAVA 使用反射进行动态编译
- Java学习之-动态编译-DynamicCompile_反射调用
- Java300StudyNote(3)-Java动态编译(DynamicCompile)、动态运行、反射调用mian方法、JavaCompiler.run()空指针问题
- Java学习之 -----动态编译 - DynamicCompile--反射调用
- 动态编译Java并通过反射执行方法
- 利用javax.tools动态编译执行java代码
- Java动态编译
- Java动态运行编译好的类两种方法
- JAVA动态编译(JavaCompiler)
- Java动态编译源代码并加载执行
- 动态编译 Java 文件 与 动态加载 Java 类
- java笔记(7)--反射之动态数组
- Java 动态编译的一点理解
- java反射学习笔记之 动态加载类
- Java中的静态编译和动态编译
- 反射已经"Out",动态编译才能"Hold"住
- 【动态页面】(二)Java反射
- Java基础之反射及动态代理,反射实现工厂模式
- JAVA核心层--反射--动态代理