- 浏览: 547396 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (740)
- css (4)
- jquery (8)
- javascript (23)
- html (0)
- uml (0)
- 设计模式 (1)
- 开发工具 (14)
- json (4)
- struts 1.x (3)
- spring (3)
- hibernate (6)
- struts 2.x (17)
- JFreechart (0)
- j2se (48)
- jsp (9)
- flex (22)
- 找工作 (1)
- 技术杂谈 (18)
- 网络编程 (5)
- io流 (1)
- ORACLE (15)
- 报表 (3)
- extjs (11)
- jpbm (2)
- swing (5)
- jspereports (3)
- sql (1)
- linux (15)
- ps (1)
- storm (4)
- hbase (8)
- li (0)
- python (1)
- hive (3)
- 机器学习 (1)
- hdfs (1)
- elasticsearch (1)
- hadoop 2.2 (5)
- hadoop (1)
最新评论
-
Tristan_S:
这个有点意思
ASM -
starryskydog:
程序修改detail band部分的样式 如内容字体大小 ...
使用jasperReport实现动态表头 -
samwong:
Good, so usefule
使用YUI Compressor压缩CSS/JS -
gc715409742:
能够告诉我怎么在web项目中使用YUI Compressor? ...
使用YUI Compressor压缩CSS/JS -
JsonTeye:
您好! 我看你的代码,我现在也在做动态报表,实现功能由用户自己 ...
使用jasperreport动态生成pdf,excel,html
这里举个简单的例子,来记录下如何用CtClass创建一个类,并且往这个类里面新加方法,
下面是代码,可以直接运行:
Java代码
package seeeyou.app.test;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.CtNewMethod;
import javassist.NotFoundException;
/**
*
* @author seeeyou
*
*/
public class TestHelloWorld2 {
public static void main(String[] args) throws NotFoundException,
IOException, CannotCompileException, InstantiationException,
IllegalAccessException, SecurityException, NoSuchMethodException,
IllegalArgumentException, InvocationTargetException {
// 用于取得字节码类,必须在当前的classpath中,使用全称
ClassPool pool = ClassPool.getDefault();
/**
* makeClass() cannot create a new interface; makeInterface() in
* ClassPool can do. Member methods in an interface can be created with
* abstractMethod() in CtNewMethod. Note that an interface method is an
* abstract method.
*/
CtClass ccClass = pool.makeClass("Point");
String bodyString = "{System.out.println(\"Call to method \");}";
//为新创建的类新加一个方法execute,无任何参数
CtMethod n1 = CtNewMethod.make(CtClass.voidType, "execute", null, null,
bodyString, ccClass);
ccClass.addMethod(n1);
/**
* 这里无法用new的形式来创建一个对象,因为已经classloader中不能有两个相同的对象,否则会报异常如下:
*Caused by: java.lang.LinkageError: loader (instance of sun/misc/Launcher$AppClassLoader):
*attempted duplicate class definition for name: "Point"
**/
Object oo = ccClass.toClass().newInstance();
Method mms = oo.getClass().getMethod("execute", null);
System.out.println("new class name is : " + oo.getClass().getName());
System.out.println("new class's method is : " + mms.invoke(oo, null));
System.out.println("---------------------------------------------");
//这一行代码将class冻结了,下面无法再对类多编辑或者修改,下面的setName会报异常如:
//Exception in thread "main" java.lang.RuntimeException: Point class is frozen
ccClass.freeze();
try{
ccClass.setName("Point2");
}catch (Exception e) {
System.out.println(e);
}
//对已经冻结的class解冻之后还可以继续编辑修改
ccClass.defrost();
System.out.println("------------- 上面的代码是对的,下面的代码将会无法执行出结果,会报错------------------------");
//第二个方法
bodyString = "public int getNumber(Integer num){System.out.println(\"Point2 Call to method \");return 10+num;}";
CtMethod n2 = CtNewMethod.make(bodyString, ccClass);//直接创建一个方法,带有一个int的参数和返回值
ccClass.addMethod(n2);
Class[] params = new Class[1];
Integer num = new Integer(15);
params[0] = num.getClass();
mms = oo.getClass().getMethod("getNumber", params);
System.out.println("new class name is : " + oo.getClass().getName());
System.out.println("new class's method is : " + mms.invoke(oo, 100));
System.out.println("---------------------------------------------");
}
}
Java代码
上面的结果是:new class name is : Point
Call to method
new class's method is : null
---------------------------------------------
java.lang.RuntimeException: Point class is frozen
---------------------------------------------
Exception in thread "main" java.lang.NoSuchMethodException: Point.getNumber(java.lang.Integer)
at java.lang.Class.getMethod(Class.java:1605)
at seeeyou.app.test.TestHelloWorld2.main(TestHelloWorld2.java:66)
错误的原因其实和简单,因为我第二次新加一个方法后,没有再次实例化一个对象,所以oo还是原来的对象,他的成员函数肯定没有新加的方法。
那我可以再次实例化下试试,代码和结果如下:
Java代码
package seeeyou.app.test;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.CtNewMethod;
import javassist.NotFoundException;
/**
*
* @author seeeyou
*
*/
public class TestHelloWorld2 {
public static void main(String[] args) throws NotFoundException,
IOException, CannotCompileException, InstantiationException,
IllegalAccessException, SecurityException, NoSuchMethodException,
IllegalArgumentException, InvocationTargetException {
// 用于取得字节码类,必须在当前的classpath中,使用全称
ClassPool pool = ClassPool.getDefault();
/**
* makeClass() cannot create a new interface; makeInterface() in
* ClassPool can do. Member methods in an interface can be created with
* abstractMethod() in CtNewMethod. Note that an interface method is an
* abstract method.
*/
CtClass ccClass = pool.makeClass("Point");
String bodyString = "{System.out.println(\"Call to method \");}";
//为新创建的类新加一个方法execute,无任何参数
CtMethod n1 = CtNewMethod.make(CtClass.voidType, "execute", null, null,
bodyString, ccClass);
ccClass.addMethod(n1);
/**
* 这里无法用new的形式来创建一个对象,因为已经classloader中不能有两个相同的对象,否则会报异常如下:
*Caused by: java.lang.LinkageError: loader (instance of sun/misc/Launcher$AppClassLoader):
*attempted duplicate class definition for name: "Point"
**/
Object oo = ccClass.toClass().newInstance();
Method mms = oo.getClass().getMethod("execute", null);
System.out.println("new class name is : " + oo.getClass().getName());
System.out.println("new class's method is : " + mms.invoke(oo, null));
System.out.println("---------------------------------------------");
//这一行代码将class冻结了,下面无法再对类多编辑或者修改,下面的setName会报异常如:
//Exception in thread "main" java.lang.RuntimeException: Point class is frozen
ccClass.freeze();
try{
ccClass.setName("Point2");
}catch (Exception e) {
System.out.println(e);
}
//对已经冻结的class解冻之后还可以继续编辑修改
ccClass.defrost();
System.out.println("------------- 上面的代码是对的,下面的代码将会无法执行出结果,会报错------------------------");
//第二个方法
bodyString = "public int getNumber(Integer num){System.out.println(\"Point2 Call to method \");return 10+num;}";
CtMethod n2 = CtNewMethod.make(bodyString, ccClass);//直接创建一个方法,带有一个int的参数和返回值
ccClass.addMethod(n2);
Class[] params = new Class[1];
Integer num = new Integer(15);
params[0] = num.getClass();//就多了下面这个实例化,但是这样会导致一个错误
oo = ccClass.toClass().newInstance();
mms = oo.getClass().getMethod("getNumber", params);
System.out.println("new class name is : " + oo.getClass().getName());
System.out.println("new class's method is : " + mms.invoke(oo, 100));
System.out.println("---------------------------------------------");
}
}
Java代码
这也会导致一个错误:new class name is : Point
Call to method
new class's method is : null
---------------------------------------------
java.lang.RuntimeException: Point class is frozen
------------- 上面的代码是对的,下面的代码将会无法执行出结果,会报错------------------------
Exception in thread "main" javassist.CannotCompileException: by java.lang.LinkageError: loader (instance of sun/misc/Launcher$AppClassLoader): attempted duplicate class definition for name: "Point"
at javassist.ClassPool.toClass(ClassPool.java:1051)
at javassist.ClassPool.toClass(ClassPool.java:994)
at javassist.ClassPool.toClass(ClassPool.java:952)
at javassist.CtClass.toClass(CtClass.java:1079)
at seeeyou.app.test.TestHelloWorld2.main(TestHelloWorld2.java:66)
Caused by: java.lang.LinkageError: loader (instance of sun/misc/Launcher$AppClassLoader): attempted duplicate class definition for name: "Point"
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:621)
at java.lang.ClassLoader.defineClass(ClassLoader.java:466)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at javassist.ClassPool.toClass2(ClassPool.java:1063)
at javassist.ClassPool.toClass(ClassPool.java:1045)
... 4 more
Java代码
原因也很简单,一个classloader里面怎么有两个重复的对象呢,除非是两个不同的classloader。。所以爆了个重复加载类的错误
原因也很简单,一个classloader里面怎么有两个重复的对象呢,除非是两个不同的classloader。。所以爆了个重复加载类的错误
Java代码
对的方式是只实例化一次:如下:
Java代码
package seeeyou.app.test;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.CtNewMethod;
import javassist.NotFoundException;
/**
*
* @author seeeyou
*
*/
public class TestHelloWorld3 {
public static void main(String[] args) throws NotFoundException,
IOException, CannotCompileException, InstantiationException,
IllegalAccessException, SecurityException, NoSuchMethodException,
IllegalArgumentException, InvocationTargetException {
// 用于取得字节码类,必须在当前的classpath中,使用全称
ClassPool pool = ClassPool.getDefault();
/**
* makeClass() cannot create a new interface; makeInterface() in
* ClassPool can do. Member methods in an interface can be created with
* abstractMethod() in CtNewMethod. Note that an interface method is an
* abstract method.
*/
CtClass ccClass = pool.makeClass("Point");
String bodyString = "{System.out.println(\"Call to method \");}";
//为新创建的类新加一个方法execute,无任何参数
CtMethod n1 = CtNewMethod.make(CtClass.voidType, "execute", null, null,
bodyString, ccClass);
ccClass.addMethod(n1);
//新加第二个方法
bodyString = "public Integer getNumber(Integer num);";
CtMethod n2 = CtNewMethod.make(bodyString, ccClass);//直接创建一个方法,带有一个int的参数和返回值
n2.setBody("{System.out.println(\"Point Call to method \");return $1;}");
ccClass.addMethod(n2);
/**
* 这里无法用new的形式来创建一个对象,因为已经classloader中不能有两个相同的对象,否则会报异常如下:
*Caused by: java.lang.LinkageError: loader (instance of sun/misc/Launcher$AppClassLoader):
*attempted duplicate class definition for name: "Point"
**/
Object oo = ccClass.toClass().newInstance();
Method mms = oo.getClass().getMethod("execute", null);
System.out.println("new class name is : " + oo.getClass().getName());
System.out.println("new class's method is : " + mms.invoke(oo, null));
System.out.println("---------------------------------------------");
//这一行代码将class冻结了,下面无法再对类多编辑或者修改,下面的setName会报异常如:
//Exception in thread "main" java.lang.RuntimeException: Point class is frozen
ccClass.freeze();
try{
ccClass.setName("Point2");
}catch (Exception e) {
System.out.println(e);
}
//对已经冻结的class解冻之后还可以继续编辑修改
ccClass.defrost();
System.out.println("------------- 上面的代码是对的,下面的代码将会无法执行出结果,会报错------------------------");
Class[] params = new Class[1];
Integer num = new Integer(0);
params[0] = num.getClass();
mms = oo.getClass().getMethod("getNumber",params);
System.out.println("new class name is : " + oo.getClass().getName());
System.out.println("new class's method is : " + mms.invoke(oo, 100));
System.out.println("---------------------------------------------");
}
}
Java代码
结果如下:new class name is : Point
Call to method
new class's method is : null
---------------------------------------------
java.lang.RuntimeException: Point class is frozen
------------- 上面的代码是对的,下面的代码将会无法执行出结果,会报错------------------------
new class name is : Point
Point2 Call to method
new class's method is : 100
---------------------------------------------
http://alicsd.com/a/226
下面是代码,可以直接运行:
Java代码
package seeeyou.app.test;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.CtNewMethod;
import javassist.NotFoundException;
/**
*
* @author seeeyou
*
*/
public class TestHelloWorld2 {
public static void main(String[] args) throws NotFoundException,
IOException, CannotCompileException, InstantiationException,
IllegalAccessException, SecurityException, NoSuchMethodException,
IllegalArgumentException, InvocationTargetException {
// 用于取得字节码类,必须在当前的classpath中,使用全称
ClassPool pool = ClassPool.getDefault();
/**
* makeClass() cannot create a new interface; makeInterface() in
* ClassPool can do. Member methods in an interface can be created with
* abstractMethod() in CtNewMethod. Note that an interface method is an
* abstract method.
*/
CtClass ccClass = pool.makeClass("Point");
String bodyString = "{System.out.println(\"Call to method \");}";
//为新创建的类新加一个方法execute,无任何参数
CtMethod n1 = CtNewMethod.make(CtClass.voidType, "execute", null, null,
bodyString, ccClass);
ccClass.addMethod(n1);
/**
* 这里无法用new的形式来创建一个对象,因为已经classloader中不能有两个相同的对象,否则会报异常如下:
*Caused by: java.lang.LinkageError: loader (instance of sun/misc/Launcher$AppClassLoader):
*attempted duplicate class definition for name: "Point"
**/
Object oo = ccClass.toClass().newInstance();
Method mms = oo.getClass().getMethod("execute", null);
System.out.println("new class name is : " + oo.getClass().getName());
System.out.println("new class's method is : " + mms.invoke(oo, null));
System.out.println("---------------------------------------------");
//这一行代码将class冻结了,下面无法再对类多编辑或者修改,下面的setName会报异常如:
//Exception in thread "main" java.lang.RuntimeException: Point class is frozen
ccClass.freeze();
try{
ccClass.setName("Point2");
}catch (Exception e) {
System.out.println(e);
}
//对已经冻结的class解冻之后还可以继续编辑修改
ccClass.defrost();
System.out.println("------------- 上面的代码是对的,下面的代码将会无法执行出结果,会报错------------------------");
//第二个方法
bodyString = "public int getNumber(Integer num){System.out.println(\"Point2 Call to method \");return 10+num;}";
CtMethod n2 = CtNewMethod.make(bodyString, ccClass);//直接创建一个方法,带有一个int的参数和返回值
ccClass.addMethod(n2);
Class[] params = new Class[1];
Integer num = new Integer(15);
params[0] = num.getClass();
mms = oo.getClass().getMethod("getNumber", params);
System.out.println("new class name is : " + oo.getClass().getName());
System.out.println("new class's method is : " + mms.invoke(oo, 100));
System.out.println("---------------------------------------------");
}
}
Java代码
上面的结果是:new class name is : Point
Call to method
new class's method is : null
---------------------------------------------
java.lang.RuntimeException: Point class is frozen
---------------------------------------------
Exception in thread "main" java.lang.NoSuchMethodException: Point.getNumber(java.lang.Integer)
at java.lang.Class.getMethod(Class.java:1605)
at seeeyou.app.test.TestHelloWorld2.main(TestHelloWorld2.java:66)
错误的原因其实和简单,因为我第二次新加一个方法后,没有再次实例化一个对象,所以oo还是原来的对象,他的成员函数肯定没有新加的方法。
那我可以再次实例化下试试,代码和结果如下:
Java代码
package seeeyou.app.test;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.CtNewMethod;
import javassist.NotFoundException;
/**
*
* @author seeeyou
*
*/
public class TestHelloWorld2 {
public static void main(String[] args) throws NotFoundException,
IOException, CannotCompileException, InstantiationException,
IllegalAccessException, SecurityException, NoSuchMethodException,
IllegalArgumentException, InvocationTargetException {
// 用于取得字节码类,必须在当前的classpath中,使用全称
ClassPool pool = ClassPool.getDefault();
/**
* makeClass() cannot create a new interface; makeInterface() in
* ClassPool can do. Member methods in an interface can be created with
* abstractMethod() in CtNewMethod. Note that an interface method is an
* abstract method.
*/
CtClass ccClass = pool.makeClass("Point");
String bodyString = "{System.out.println(\"Call to method \");}";
//为新创建的类新加一个方法execute,无任何参数
CtMethod n1 = CtNewMethod.make(CtClass.voidType, "execute", null, null,
bodyString, ccClass);
ccClass.addMethod(n1);
/**
* 这里无法用new的形式来创建一个对象,因为已经classloader中不能有两个相同的对象,否则会报异常如下:
*Caused by: java.lang.LinkageError: loader (instance of sun/misc/Launcher$AppClassLoader):
*attempted duplicate class definition for name: "Point"
**/
Object oo = ccClass.toClass().newInstance();
Method mms = oo.getClass().getMethod("execute", null);
System.out.println("new class name is : " + oo.getClass().getName());
System.out.println("new class's method is : " + mms.invoke(oo, null));
System.out.println("---------------------------------------------");
//这一行代码将class冻结了,下面无法再对类多编辑或者修改,下面的setName会报异常如:
//Exception in thread "main" java.lang.RuntimeException: Point class is frozen
ccClass.freeze();
try{
ccClass.setName("Point2");
}catch (Exception e) {
System.out.println(e);
}
//对已经冻结的class解冻之后还可以继续编辑修改
ccClass.defrost();
System.out.println("------------- 上面的代码是对的,下面的代码将会无法执行出结果,会报错------------------------");
//第二个方法
bodyString = "public int getNumber(Integer num){System.out.println(\"Point2 Call to method \");return 10+num;}";
CtMethod n2 = CtNewMethod.make(bodyString, ccClass);//直接创建一个方法,带有一个int的参数和返回值
ccClass.addMethod(n2);
Class[] params = new Class[1];
Integer num = new Integer(15);
params[0] = num.getClass();//就多了下面这个实例化,但是这样会导致一个错误
oo = ccClass.toClass().newInstance();
mms = oo.getClass().getMethod("getNumber", params);
System.out.println("new class name is : " + oo.getClass().getName());
System.out.println("new class's method is : " + mms.invoke(oo, 100));
System.out.println("---------------------------------------------");
}
}
Java代码
这也会导致一个错误:new class name is : Point
Call to method
new class's method is : null
---------------------------------------------
java.lang.RuntimeException: Point class is frozen
------------- 上面的代码是对的,下面的代码将会无法执行出结果,会报错------------------------
Exception in thread "main" javassist.CannotCompileException: by java.lang.LinkageError: loader (instance of sun/misc/Launcher$AppClassLoader): attempted duplicate class definition for name: "Point"
at javassist.ClassPool.toClass(ClassPool.java:1051)
at javassist.ClassPool.toClass(ClassPool.java:994)
at javassist.ClassPool.toClass(ClassPool.java:952)
at javassist.CtClass.toClass(CtClass.java:1079)
at seeeyou.app.test.TestHelloWorld2.main(TestHelloWorld2.java:66)
Caused by: java.lang.LinkageError: loader (instance of sun/misc/Launcher$AppClassLoader): attempted duplicate class definition for name: "Point"
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:621)
at java.lang.ClassLoader.defineClass(ClassLoader.java:466)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at javassist.ClassPool.toClass2(ClassPool.java:1063)
at javassist.ClassPool.toClass(ClassPool.java:1045)
... 4 more
Java代码
原因也很简单,一个classloader里面怎么有两个重复的对象呢,除非是两个不同的classloader。。所以爆了个重复加载类的错误
原因也很简单,一个classloader里面怎么有两个重复的对象呢,除非是两个不同的classloader。。所以爆了个重复加载类的错误
Java代码
对的方式是只实例化一次:如下:
Java代码
package seeeyou.app.test;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.CtNewMethod;
import javassist.NotFoundException;
/**
*
* @author seeeyou
*
*/
public class TestHelloWorld3 {
public static void main(String[] args) throws NotFoundException,
IOException, CannotCompileException, InstantiationException,
IllegalAccessException, SecurityException, NoSuchMethodException,
IllegalArgumentException, InvocationTargetException {
// 用于取得字节码类,必须在当前的classpath中,使用全称
ClassPool pool = ClassPool.getDefault();
/**
* makeClass() cannot create a new interface; makeInterface() in
* ClassPool can do. Member methods in an interface can be created with
* abstractMethod() in CtNewMethod. Note that an interface method is an
* abstract method.
*/
CtClass ccClass = pool.makeClass("Point");
String bodyString = "{System.out.println(\"Call to method \");}";
//为新创建的类新加一个方法execute,无任何参数
CtMethod n1 = CtNewMethod.make(CtClass.voidType, "execute", null, null,
bodyString, ccClass);
ccClass.addMethod(n1);
//新加第二个方法
bodyString = "public Integer getNumber(Integer num);";
CtMethod n2 = CtNewMethod.make(bodyString, ccClass);//直接创建一个方法,带有一个int的参数和返回值
n2.setBody("{System.out.println(\"Point Call to method \");return $1;}");
ccClass.addMethod(n2);
/**
* 这里无法用new的形式来创建一个对象,因为已经classloader中不能有两个相同的对象,否则会报异常如下:
*Caused by: java.lang.LinkageError: loader (instance of sun/misc/Launcher$AppClassLoader):
*attempted duplicate class definition for name: "Point"
**/
Object oo = ccClass.toClass().newInstance();
Method mms = oo.getClass().getMethod("execute", null);
System.out.println("new class name is : " + oo.getClass().getName());
System.out.println("new class's method is : " + mms.invoke(oo, null));
System.out.println("---------------------------------------------");
//这一行代码将class冻结了,下面无法再对类多编辑或者修改,下面的setName会报异常如:
//Exception in thread "main" java.lang.RuntimeException: Point class is frozen
ccClass.freeze();
try{
ccClass.setName("Point2");
}catch (Exception e) {
System.out.println(e);
}
//对已经冻结的class解冻之后还可以继续编辑修改
ccClass.defrost();
System.out.println("------------- 上面的代码是对的,下面的代码将会无法执行出结果,会报错------------------------");
Class[] params = new Class[1];
Integer num = new Integer(0);
params[0] = num.getClass();
mms = oo.getClass().getMethod("getNumber",params);
System.out.println("new class name is : " + oo.getClass().getName());
System.out.println("new class's method is : " + mms.invoke(oo, 100));
System.out.println("---------------------------------------------");
}
}
Java代码
结果如下:new class name is : Point
Call to method
new class's method is : null
---------------------------------------------
java.lang.RuntimeException: Point class is frozen
------------- 上面的代码是对的,下面的代码将会无法执行出结果,会报错------------------------
new class name is : Point
Point2 Call to method
new class's method is : 100
---------------------------------------------
http://alicsd.com/a/226
发表评论
-
使用Java调用谷歌搜索
2013-10-19 12:50 902转自:http://yangshangchuan.iteye ... -
走出类加载器迷宫
2013-10-16 14:22 691这是前几天在看类加载器机制时搜到的一篇旧文,网上搜了搜 ... -
Log4j使用
2012-12-05 11:34 784... -
Java的JDBC数据库连接池实现方法
2012-09-14 10:20 743虽然J2EE程序员一般都有现成的应用服务器所带的JDBC数据库 ... -
什么是线程安全和线程不安全
2012-08-23 14:49 795什么是线程安全和线程 ... -
线程运行栈信息的获取
2012-08-23 14:49 833线程运行栈信息的获取 ... -
log4j 获取行号
2012-08-23 14:50 1163log4jjava 今天看log4j的日志,突然注意到log ... -
javassist【动态改字节码】学习二
2012-08-22 11:53 839写了个例子。 有一个类: Java代码 package ... -
javassist[动态改字节码]学习一
2012-08-22 11:52 905前段时间为了公司里的 ... -
JVM启动参数
2012-08-22 11:51 948一、标准参数 1.-server -client 虚拟机服务器 ... -
使用javassist动态注入代码
2012-08-22 11:33 789关于java字节码的处理,目前有很多工具,如bcel,asm。 ... -
利用javaassist修改Class文件
2012-08-22 11:22 1504我们在开发中有时候会遇到这样的问题,就是使用的某个第三方包中的 ... -
JavaMail
2012-08-16 20:03 952在Java EE应用程序中,经常需要发送E-mail。Java ... -
让java变成脚本语言
2012-08-15 12:42 0今天在弄游戏的GM模块,大部分gm命令很简单,只是单纯改 ... -
JavaAgent
2012-08-13 23:43 1278-javaagent 这个JVM参数是JDK 5引进的. j ... -
在Eclipse RCP中实现控制反转(IoC)
2012-08-13 23:13 972摘要:这篇文章描述了 ... -
aop的几种实现方式
2012-08-05 21:14 9491 AOP各种的实现 AOP就是面向切面编程,我们可以从 ... -
Java编程中“为了性能”尽量要做到的一些地方
2012-07-28 21:36 596http://www.iteye.com/magazines/ ... -
java基础拾遗
2012-06-17 10:05 882. 电梯直达 楼主 发表于 2012-1-28 13: ... -
使用 HttpClient 和 HtmlParser 实现简易爬
2012-05-01 17:57 1106使用 HttpClient 和 HtmlParse ...
相关推荐
Javassist 提供了java类库,用于方便操控Java字节码。功能包括:运行时创建java class,修改class。与其他同类工具(asm等)不同的是,Javassist提供了两个层面的API: 1.java代码层 2.字节码层 通过java代码层,...
`javassist`是一个强大的字节码编辑器和类文件操作库,它能够帮助开发者动态地创建或修改类定义。通过`javassist`,可以方便地添加方法、字段或修改现有方法的行为,而无需接触原始源代码。 ##### 2. jclasslib `...
3. 字节码生成:Javassist提供了一系列API,可以方便地生成新的类和方法的字节码。这些API类似于Java源代码的构造,使得生成字节码的过程更加直观和简洁。 4. AOP支持:面向切面编程是一种编程范式,用于解耦关注点...
javassist, Java字节码工程工具包 Java字节码工程工具包 版本 3版权所有( C ) 1999 -2017按 Shigeru Chiba,保留所有权利。Javassist ( Java编程助手) 使Java字节码操作简单。 它是一个类库,用于在Java中编辑字节码
尽管jclasslib主要用于查看和分析字节码,但通过与其他工具(如ASM、BCEL或Javassist)结合,可以实现字节码的修改。例如,可以先使用jclasslib来理解一个类的字节码,然后利用这些工具进行动态或静态的字节码注入,...
Java字节码编辑是Java开发中的一个高级主题,它允许开发者在运行时修改或增强类的行为。`javassist`库正是这样一个工具,它为Java...学习并熟练掌握`javassist`,将极大地提升你在Java动态编程和字节码操作方面的技能。
3. **检查和修改字节码**:现在,我们可以通过`CtMethod`对象访问和修改方法的字节码。例如,我们可以在方法调用之前或之后插入额外的代码。 ```java ctMethod.insertBefore("{ System.out.println(\"Before method...
Javassist是一个强大的Java字节码操作库,它允许开发者在运行时动态修改或创建类。Javassist的出现使得开发者无需深入理解底层字节码指令就能方便地操作类、方法和字段,降低了字节码操作的难度。下面将详细介绍...
Javassist 官方手册中文版 Javassist 是一个动态生成字节码的框架,生成的字节码可以输出或实时加载到 JVM 中。...通过学习和掌握 Javassist,可以使开发者更好地控制和操作 Java 字节码,提高开发效率和质量。
在这个“JavaAgent: Javassist与Asm JavaAgent字节码动态编程项目”中,我们将深入探讨如何利用Javassist和ASM这两个库来实现JavaAgent。 首先,Javassist是一个开源的Java字节码操作框架,它使得开发者可以在运行...
Javassist(JAVA编程ASSISTant)使Java字节码操作变得简单。 它是一个用Java编辑字节码的类库。 它使Java程序可以在运行时定义新类,并在JVM加载它时修改类文件。 与其他类似的字节码编辑器不同,Javassist提供了两...
2. **字节码生成**:BCEL提供了一套接口和类,使得开发者可以动态地生成字节码,这对于创建动态代理、AOP(面向切面编程)等场景非常有用。 3. **代码优化**:通过修改字节码,BCEL可以实现代码的优化,例如去除...
3. **字节码重新生成**:使用Javassist将修改后的源代码重新编译为字节码,并替换原有的.class文件。 4. **加载到JVM**:最后,将修改后的字节码加载到Java虚拟机,使修改生效。 **注意事项** 虽然这种动态字节码...
2. **学习API**:熟悉Javassist提供的各种类和方法,如`ClassPool`、` CtClass`、`CtMethod`等,这些都是操作字节码的核心类。 3. **创建或修改类**:通过`ClassPool`获取或创建类对象,然后利用`CtClass`的方法来...
通过小傅哥的文章和教程,读者可以学习到如何使用这三种不同的字节码操作框架,以及如何将这些知识应用于全链路监控的实际案例中。通过案例学习,可以更好地将枯燥的字节码编程知识融入实际场景,深化理解并应用于...
在实际操作中,我们可能会使用如 ASM、ByteBuddy 或 Javassist 这样的字节码库来帮助创建和应用 ClassFileTransformer。这些库提供了友好的 API,让我们能够方便地读取、修改和生成字节码。 然而,这种方法并不总是...
字节码插件,如ASM、Javassist或ByteBuddy,是在Java字节码层面操作,可以修改或增强类的功能。例如,我们可以在编译时自动插入代码,以实现埋点逻辑。 全埋点日志采集是通过跟踪用户在应用中的所有操作,记录下每...
Javaagent和javassist是Java开发中的两个重要工具,它们在软件开发中有着广泛的应用,特别是在动态代理、代码增强和字节码操作等领域。本篇将详细介绍这两个技术,并结合实际示例进行解析。 首先,让我们来了解`...
3. **字节码修改**:可以插入、删除或替换已有的字节码指令,实现代码的动态增强。 4. **类转换**:`javassist` 提供了转换器,可以将类从一种形式转换为另一种形式,例如从 Java 源码转换为字节码。 另一方面,`jd...