Java反射:创建一个实现类
现在如何创建一个实现Java反射:创建一个实现类,java,reflection,interface,Java,Reflection,Interface,现在如何创建一个实现someInterface的新类 我需要创建一个新类,并将其传递给一个函数,该函数需要一个SomeInterface作为参数。创建一些假装在运行中实现接口的东西其实并不难。可以在实现后使用来处理任何方法调用 当然,您实际上可以使用类似的库生成一个真正的类 如果这是出于测试目的,您应该看看模拟框架,如和。如果您想超越接口,您可能需要看看和。结合起来,它们将允许您完成一些非常强大的工作,扩展一个抽象类并实例化它。(例如,将其用于该目的。) 如果您想坚持使用接口,请按照Jon Sk
someInterface
的新类
我需要创建一个新类,并将其传递给一个函数,该函数需要一个
SomeInterface
作为参数。创建一些假装在运行中实现接口的东西其实并不难。可以在实现后使用来处理任何方法调用
当然,您实际上可以使用类似的库生成一个真正的类
如果这是出于测试目的,您应该看看模拟框架,如和。如果您想超越接口,您可能需要看看和。结合起来,它们将允许您完成一些非常强大的工作,扩展一个抽象类并实例化它。(例如,将其用于该目的。)
如果您想坚持使用接口,请按照Jon Skeet所说的做:)。实际上,您必须在class.fromName()方法中使用类名,并强制转换为您的接口类型。看看下面的示例是否有帮助
Class someInterface = Class.fromName("some.package.SomeInterface");
轻松,去营救
完整工作示例:
public class Main {
public static void main(String[] args) throws Exception {
Car ferrari = (Car) Class.forName("Mercedez").newInstance();
System.out.println(ferrari.getName());
}
}
interface Car {
String getName();
}
class Mercedez implements Car {
@Override
public String getName() {
return "Mercedez";
}
}
class Ferrari implements Car {
@Override
public String getName() {
return "Ferrari";
}
}
接口IRobot{
字符串名();
字符串名称(字符串标题);
无效谈话();
空谈(弦乐);
无效谈话(int-stuff);
void Talk(字符串内容、int more_内容);
无效谈话(int-stuff,int-more_-stuff);
void Talk(int-stuff,String-more\u-stuff);
}
公共类代理测试{
公共静态void main(字符串参数[]){
IRobot robot=(IRobot)java.lang.reflect.Proxy.newProxyInstance(
IRobot.class.getClassLoader(),
新java.lang.Class[]{IRobot.Class},
新的java.lang.reflect.InvocationHandler(){
@凌驾
公共对象调用(对象代理,java.lang.reflect.Method,对象[]args)抛出java.lang.Throwable{
String method_name=method.getName();
Class[]classes=method.getParameterTypes();
if(方法名称等于(“名称”)){
如果(args==null){
返回“Mr IRobot”;
}否则{
返回参数[0]+“IRobot”;
}
}else if(方法名称等于(“Talk”)){
开关(类.长度){
案例0:
System.out.println(“你好”);
打破
案例1:
if(类[0]==int.class){
System.out.println(“Hi.Int:+args[0]);
}否则{
System.out.println(“Hi.String:+args[0]);
}
打破
案例2:
if(类[0]==String.class){
System.out.println(“Hi.String:+args[0]+”.Int:+args[1]);
}否则{
if(类[1]==String.class){
System.out.println(“Hi.int:+args[0]+.”字符串:+args[1]);
}否则{
System.out.println(“Hi.int:+args[0]+”.int:+args[1]);
}
}
打破
}
}
返回null;
}
});
System.out.println(robot.Name());
System.out.println(robot.Name(“Dr”);
robot.Talk();
机器人说话(“东西”);
机器人对话(100);
机器人说话(“东西”,200);
机器人对话(300400);
机器人说话(500,“东西”);
}
}
在运行中创建类恐怕一点也不容易。@MichaelMyers也不难,哇,太好了!我想知道java.lang.reflect包中还有什么我不知道的?这没有抓住问题的关键。OP的问题有点不清楚,但他们正在寻找一种在运行时实现类的方法。不仅仅是创建一个未知类的对象,而是完全有效地创建一个新类。它甚至不接近主题。这是对这个答案的一个很好的补充:
interface IRobot {
String Name();
String Name(String title);
void Talk();
void Talk(String stuff);
void Talk(int stuff);
void Talk(String stuff, int more_stuff);
void Talk(int stuff, int more_stuff);
void Talk(int stuff, String more_stuff);
}
public class ProxyTest {
public static void main(String args[]) {
IRobot robot = (IRobot) java.lang.reflect.Proxy.newProxyInstance(
IRobot.class.getClassLoader(),
new java.lang.Class[] { IRobot.class },
new java.lang.reflect.InvocationHandler() {
@Override
public Object invoke(Object proxy, java.lang.reflect.Method method, Object[] args) throws java.lang.Throwable {
String method_name = method.getName();
Class<?>[] classes = method.getParameterTypes();
if (method_name.equals("Name")) {
if (args == null) {
return "Mr IRobot";
} else {
return args[0] + " IRobot";
}
} else if (method_name.equals("Talk")) {
switch (classes.length) {
case 0:
System.out.println("Hello");
break;
case 1:
if (classes[0] == int.class) {
System.out.println("Hi. Int: " + args[0]);
} else {
System.out.println("Hi. String: " + args[0]);
}
break;
case 2:
if (classes[0] == String.class) {
System.out.println("Hi. String: " + args[0] + ". Int: " + args[1]);
} else {
if (classes[1] == String.class) {
System.out.println("Hi. int: " + args[0] + ". String: " + args[1]);
} else {
System.out.println("Hi. int: " + args[0] + ". Int: " + args[1]);
}
}
break;
}
}
return null;
}
});
System.out.println(robot.Name());
System.out.println(robot.Name("Dr"));
robot.Talk();
robot.Talk("stuff");
robot.Talk(100);
robot.Talk("stuff", 200);
robot.Talk(300, 400);
robot.Talk(500, "stuff");
}
}