相关疑难解决方法(0)

如何在运行时编译和部署java类?

我正在编写一个规则引擎,它执行由条件结构确定的简单赋值.规则是XML格式的项目的先决条件.我已经将我的XML模式建模为类似于简单的代码块.我希望解析XML,然后将其转换为Java代码.然后,我希望在运行时编译(并运行)此代码.这样做意味着我的规则引擎不再充当解释器,而是执行本机Java字节代码.

我已经找到了解析阶段和或多或少的Java代码生成阶段.我现在想弄清楚最后阶段 - 运行阶段的编译.

遵循这个线程:编译为java字节码(不使用Java)我已经意识到以下可能的解决方案:

我希望能比较这些以及在运行阶段解决Java编译的其他建议.

java runtime compilation

19
推荐指数
2
解决办法
3万
查看次数

通过反射向类添加新方法

是否可以通过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 reflection

7
推荐指数
1
解决办法
2万
查看次数

在运行时编织方面

我正在寻找一种Java解决方案,它允许我在运行时使用AOP在已经运行的代码之上编写新代码.关键是不要求重启JVM.另外,我想在运行时删除编织,让旧代码在编织之前运行.

我在想AspectJ加载时编织+运行时类加载/卸载会做到这一点.有人试过吗?有什么建议?谢谢.

java aop aspectj runtime load-time-weaving

7
推荐指数
2
解决办法
8238
查看次数

动态创建字段和方法

我想为给定的类添加新的字段(变量)和封装方法.例如:类名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:谢谢你们所有人的回答,并得到了许多信息和想法.并改变了从你的建议到更好的道路的方式

java

7
推荐指数
1
解决办法
2万
查看次数

在android中添加存在类的方法

我正在寻找一种方法将一些方法添加到存在的类中,如下所示:

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)

有什么方法可以解决这个问题吗?

java android design-patterns

6
推荐指数
1
解决办法
1410
查看次数

OO设计模式:如何动态添加方法?

我在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)

c# java oop design-patterns

2
推荐指数
1
解决办法
855
查看次数

在不扩展类的情况下将方法添加到不同文件中的Java类

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,但是在另一个文件中.有没有办法创建这个新方法而无需编写或通过扩展类访问它?

谢谢.

java methods extends class function

0
推荐指数
1
解决办法
731
查看次数

有没有办法在运行时向类定义添加方法?

有一个更好的问题(链接如下)。我的问题鼓励了糟糕的编码实践,但没有概述这些实践的风险。

Java 类可以在运行时向自身添加方法吗?

原来的问题如下:


有没有办法在运行时向类定义添加方法?

例如,假设我有以下界面

public interface Singleton<T> {
    @StaticContract
    T getInstanceStatic();
}
Run Code Online (Sandbox Code Playgroud)

在运行时,我会扫描所有类中带有注释“StaticContract”的方法,并将已实现方法的静态版本添加到类定义中。但是,我不知道我将如何去做,或者这是否可能。

在我当前的实现中,如果运行时反射在初始化期间没有找到方法的静态方法,我会抛出一个 NoSuchMethodError。最大的问题是,如果开发人员不熟悉接口,他们可能不知道他们应该创建静态方法。非静态 getInstanceStatic() 对单例没有意义。它只是作为创建静态方法的提醒。

结合使用反射恢复擦除类型的能力,这将使我能够使用泛型远远超出预期。例如,您将不再需要定义和传递工厂对象。您可以在工厂生产的类中定义方法。

另外,如果在运行时没有办法做到这一点,有没有办法在编译期做到这一点?

java

0
推荐指数
1
解决办法
86
查看次数