我正在编写一个规则引擎,它执行由条件结构确定的简单赋值.规则是XML格式的项目的先决条件.我已经将我的XML模式建模为类似于简单的代码块.我希望解析XML,然后将其转换为Java代码.然后,我希望在运行时编译(并运行)此代码.这样做意味着我的规则引擎不再充当解释器,而是执行本机Java字节代码.
我已经找到了解析阶段和或多或少的Java代码生成阶段.我现在想弄清楚最后阶段 - 运行阶段的编译.
遵循这个线程:编译为java字节码(不使用Java)我已经意识到以下可能的解决方案:
我希望能比较这些以及在运行阶段解决Java编译的其他建议.
是否可以通过java中的反射向类添加方法?
public class BaseDomain {
public BaseDomain(){
Field[] fields = this.getClass().getDeclaredFields();
for(int i=0; i<fields.length; i++){
String field = fields[i].toString();
String setterMethod = "public void set" + field.toLowerCase();
//Now I want to add this method to this class.
}
}
}
Run Code Online (Sandbox Code Playgroud) 我正在寻找一种Java解决方案,它允许我在运行时使用AOP在已经运行的代码之上编写新代码.关键是不要求重启JVM.另外,我想在运行时删除编织,让旧代码在编织之前运行.
我在想AspectJ加载时编织+运行时类加载/卸载会做到这一点.有人试过吗?有什么建议?谢谢.
我想为给定的类添加新的字段(变量)和封装方法.例如:类名Student没有任何字段如下:
public class Student implements Serializable{
}
Run Code Online (Sandbox Code Playgroud)
然后在我的应用程序中创建一个实例;
Student s=new Student();
Run Code Online (Sandbox Code Playgroud)
我想在运行时添加学生类不存在的新方法.例如:我想添加一个名为studentName,getStudentName()和setStudentName()方法的字段.
然后在运行时,学生对象将是这样的;
public class Student implements Serializable{
private String studentName;
public void setStudentName(..){}
public String getStudentName(){return ...;}
}
Run Code Online (Sandbox Code Playgroud)
在我的应用程序中,对象被写入文本文件,所有相同类型的对象都没有所有变量.因此,我只想添加必需的字段来节省内存.
有办法有办法吗?任何示例代码或链接?
编辑:或者我们可以创建一个类,并创建不存在的实例?
编辑2:谢谢你们所有人的回答,并得到了许多信息和想法.并改变了从你的建议到更好的道路的方式
我正在寻找一种方法将一些方法添加到存在的类中,如下所示:
String s = "";
s.doSomething();
Run Code Online (Sandbox Code Playgroud)
在目标C中,我可以使用类别来执行此操作.
@interface NSString( Stuff)
-(void)doSomething();
@end
Run Code Online (Sandbox Code Playgroud)
android有这样的东西吗?还是另一个黑客?
更新:实际上,我遇到了这个问题:我从jar文件中使用了一个类(不是final)(所以,我无法触及它的源代码).然后我想在不使用继承的情况下将方法(或类似的东西)添加到这个类中.例如:
public class Provider{
// many methods and fields go here...
public String getName(){}
}
Run Code Online (Sandbox Code Playgroud)
我想做的就是:
provider.print(); //that call getName() method;
Run Code Online (Sandbox Code Playgroud)
我也试过代理模式,它有效,但我不喜欢这种方式(因为它像一个包装类,我必须存储一个具有许多字段和方法的对象,只使用一个方法):
public class ProxyProvider{
Provider provider;
public ProxyProvider(Provider provider){
this.provider = provider;
}
public void print(){
String name = provider.getName();
//do something
}
}
Run Code Online (Sandbox Code Playgroud)
有什么方法可以解决这个问题吗?
我在C#(或Java,无关紧要)中实现了一个简单的树结构,其中所有内容都围绕着抽象类Node及其子类.Node提供与数学图论相关的方法和属性.例如,Node.Parent引用父节点和Node.Children子节点
class Node {
Node Parent;
Node[] Children;
void appendNode(Node node) { ... }
}
Run Code Online (Sandbox Code Playgroud)
我正在使用树来执行计算.计算涉及大量递归,我还需要为每个节点存储中间值.对于每个计算,我已经向Node类引入了其他属性和方法,例如
class Node {
Node Parent;
Node[] Children;
// Calculate weight
int weight; // current weight
void recalculateWeight() {
// perform some heavily recursive stuff
// involving Parent.recalculateWeight()
// and update the value of the variable weight
}
int price; // current price
void recalculatePrice() {
// perform some heavily recursive stuff
// involving Parent.recalculatePrice()
// and update the value of the variable price
} …Run Code Online (Sandbox Code Playgroud) package com.companyxyz.api.person;
public class Man {
public var1;
public var2;
...
private static void createAuth() {
...
}
// public methods go here
...
}
Run Code Online (Sandbox Code Playgroud)
我想创建一个新的公共方法来访问私有方法createAuth,但是在另一个文件中.有没有办法创建这个新方法而无需编写或通过扩展类访问它?
谢谢.
有一个更好的问题(链接如下)。我的问题鼓励了糟糕的编码实践,但没有概述这些实践的风险。
原来的问题如下:
有没有办法在运行时向类定义添加方法?
例如,假设我有以下界面
public interface Singleton<T> {
@StaticContract
T getInstanceStatic();
}
Run Code Online (Sandbox Code Playgroud)
在运行时,我会扫描所有类中带有注释“StaticContract”的方法,并将已实现方法的静态版本添加到类定义中。但是,我不知道我将如何去做,或者这是否可能。
在我当前的实现中,如果运行时反射在初始化期间没有找到方法的静态方法,我会抛出一个 NoSuchMethodError。最大的问题是,如果开发人员不熟悉接口,他们可能不知道他们应该创建静态方法。非静态 getInstanceStatic() 对单例没有意义。它只是作为创建静态方法的提醒。
结合使用反射恢复擦除类型的能力,这将使我能够使用泛型远远超出预期。例如,您将不再需要定义和传递工厂对象。您可以在工厂生产的类中定义方法。
另外,如果在运行时没有办法做到这一点,有没有办法在编译期做到这一点?