参考
https://sunweiguo.github.io/2019/02/04/java-basic/彻底理解java反射/
演示使用
如何能利用反射机制来实现OCP
generated by GPT
这里给出一个简化的例子以演示如何使用config.xml
文件和反射来动态创建对象。假设我们有一个Button
接口和两个实现了该接口的类:RoundButton
和SquareButton
。我们还有一个ButtonHandler
接口和一个实现了该接口的类:MyButtonHandler
。
首先,我们定义Button
接口和ButtonHandler
接口:
1 2 3 4 5 6 7
| public interface Button { void click(); }
public interface ButtonHandler { void handle(); }
|
然后,我们定义RoundButton
、SquareButton
和MyButtonHandler
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| public class RoundButton implements Button { private ButtonHandler handler;
public RoundButton(ButtonHandler handler) { this.handler = handler; }
@Override public void click() { handler.handle(); } }
public class SquareButton implements Button { private ButtonHandler handler;
public SquareButton(ButtonHandler handler) { this.handler = handler; }
@Override public void click() { handler.handle(); } }
public class MyButtonHandler implements ButtonHandler { @Override public void handle() { System.out.println("Button clicked!"); } }
|
接下来,我们创建config.xml
文件:
1 2 3 4
| <button> <type>com.example.RoundButton</type> <handler>com.example.MyButtonHandler</handler> </button>
|
最后,我们使用Java的反射机制来读取config.xml
文件并创建对象:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| public class Main { public static void main(String[] args) { try { String type = "com.example.RoundButton"; String handler = "com.example.MyButtonHandler";
Class<?> handlerClass = Class.forName(handler); ButtonHandler buttonHandler = (ButtonHandler) handlerClass.getDeclaredConstructor().newInstance();
Class<?> buttonClass = Class.forName(type); Button button = (Button) buttonClass.getDeclaredConstructor(ButtonHandler.class).newInstance(buttonHandler);
button.click(); } catch (Exception e) { e.printStackTrace(); } } }
|
当你运行这个程序时,它会输出:“Button clicked!”。这就是我们通过读取config.xml
文件和使用反射来动态创建Button
和ButtonHandler
对象的例子。
注意:这个例子非常简化,实际的XML解析和错误处理会更复杂。此外,确保你的类路径(classpath)正确设置,以便Java可以找到你的类。