Java中反射及动态编译
来源:互联网 发布:考研数学辅导书 知乎 编辑:程序博客网 时间:2024/06/02 07:02
1.先写个Users类,然后通过反射,操作这个类
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}}
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 blocke.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[] {});}}
阅读全文
0 0
- Java中反射及动态编译
- java反射及动态代理
- C# 动态编译及反射执行
- java动态编译,反射加载类
- JAVA 使用反射进行动态编译
- Java中动态编译
- java反射机制原理及虚拟机编译
- 动态编译-反射调用
- Java中反射、静态代理、动态代理
- Java学习之-动态编译-DynamicCompile_反射调用
- Java中类加载机制及反射
- java中反射的作用及用法
- java中的反射三(反射机制深入---静态代理,动态代理及cglib动态代理)
- c#动态编译反射计算器
- 黑马程序员-Java反射机制及JDK动态代理技术
- 黑马程序员java学习笔记,反射及动态代理
- JavaSE(10):Java反射技术及动态代理
- 关于java的反射机制及动态代理
- 3、操作系统内存管理——段页式(虚拟内存)
- 存储过程+事务
- TCP协议3次握手
- 学Java过程中最重要的8幅图,资深程序员都知道重要性
- 【JavaSE笔记】IO(二)File类
- Java中反射及动态编译
- Android 使用逐帧动画找不到标签
- 文章标题
- 程序员高逼格指南
- 【nyoj108】士兵杀敌一(线段树)
- POJ1236:Network of Schools(强连通)
- http状态码301和302详解及区别——辛酸的探索之路
- Gift
- 单调队列 移动区间(长度固定)最值问题。