public class AllStaticClass {
protected static void method0(){
....
}
public static void method1(){
method0();
}
public static void method2(){
method0();
}
}
类似于这样的类,我只是想稍微修改方法method0()中的实现细节,不改动其它方法,是否有好的解决方案?
protected static void method0(){
....
}
public static void method1(){
method0();
}
public static void method2(){
method0();
}
}
类似于这样的类,我只是想稍微修改方法method0()中的实现细节,不改动其它方法,是否有好的解决方案?
解决方案 »
- 两个二维数组怎么合并一起
- 简单面试题_线程方面
- 如何使用jface组件开发有下拉菜单的工具栏?
- JBUTTON本身已经设置成透明,我想让加在JBUTTON里的图片的背景也透明,要如何做到?请帮忙解决下,感激不尽!
- 求 关于structs和spring的介绍的 ppt文档,急等中~~
- 请问如何判定一个类是否实现了某个接口?
- 关于异或
- 怎么根据jdbc中select返回结果,处理流程?
- 我出100分,帮忙看看我的classpath哪里错了?
- awt中的高级事件(语意事件)和低级事件的区别
- 某人用javascript写的星际争霸,太强了,没话说~~~~~~~~
- 使用AlloyLookAndFeel后在登陆框输入中文为什么会抛出异常???
Player secondPlayer = getSecondPlayer();
Judgment judgment = getJudgment(); // do something...for match
}
====================================>
Player getFirstPlayer() { Player result = null; // whatever u do... return result;}
============================>
Player getSecondPlayer() {
Player result = null; // whatever u do... return result;
}
============================>
Judgment getJudgment() {
Judgment result = null; // whatever u do... return result;
}所有提炼出的函数必定是一种目的,无论内部如何实现这些方法,他们都必定为他们的接口定义服务,而其他的调用者(比如aTableTennisMatch)依赖的应该仅仅是被调者(比如getJudgment)的接口定义,如果 getJudgment 的内部实现的转变会让 aTableTennisMatch 感到不适应,那一定是当时提炼时出了问题。如果需要修改这个函数,仅仅是因为mehtod0中的某些部分是你想要的,所以你想依靠这个函数为基础打造一个新的函数,那么你应该构造一个 newMehtod,并且提炼出method0中与newMethod共用的交集部分,example:private static void IntersectionPart() { // do something... }
======================================>
protected static void method0() { // do something before IntersectionPart... IntersectionPart(); // do something after IntersectionPart...}
=====================================>
static void newMethod() { // do something before IntersectionPart... IntersectionPart(); // do something after IntersectionPart...}
更复杂的情况是,如果你的method0是因为某些调用者的需要而进行改变,同时这种改变又会让另一些调用者感到不舒服时,你就应该考虑是不是当时的概念提炼出了问题,一种概念不应该会随内部的实现改变而改变;同时她也不应该使得不同的调用者对其的期望不同,否则你应该考虑这个方法是否具有多重职责?将职责作为一种新的概念重新提炼出去,使得外部调用者面对此被调者时永远保持一个姿态,一改全改,比如 connection.isOpen(),无论数据库链接如何定义何为open,总之所有的调用者当获得返回为true时就必定认为她是打开的,获得false时则认为她必定时关闭的。@.@||~
class Orig {static void operator() { // do something... }}=============== Wrappageclass =============
class Wrappage{static void operator() {
// do something before really operation... Orig.operation(); // do something after really operation...
}}如果是控制更细节的东西呵呵呵呵呵呵黔驴技穷
@.@||~
最好是自己再写个ClassLoader,这样就不用这么别扭的调用方式了。
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.NotFoundException;
public class TranslateMethod {
public static void translateMethod(String classname, String methodname)
{
try {
CtClass clazz = ClassPool.getDefault().get(classname);
Impl(clazz, methodname);
} catch (NotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private static void Impl(CtClass clazz, String methodname)
{
try {
CtMethod method = clazz.getDeclaredMethod(methodname);
StringBuffer code = new StringBuffer();
code.append("{");
code.append("\n System.out.println(\""+methodname+"() has changed!\");\n");
code.append("}");
method.setBody(code.toString());
Method mth = clazz.toClass().getDeclaredMethod(methodname,null);
mth.invoke(clazz);
} catch (NotFoundException e) {
e.printStackTrace();
} catch (CannotCompileException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
public static void main(String[] args)
{
TranslateMethod.translateMethod("AllStaticClass", "method0");
}}