仅将java类实例转换为基本类型

时间:2012-07-15 10:24:38

标签: java transform converter primitive-types flatten

我想将一个实例从给定的Java类“展平”/转换为仅包含基本类型的另一个实例。

来自不是原始类型的对象的每个字段也必须递归地展平,以便生成的对象包含原始对象的展平视图,仅包含基本类型。

例如,给定以下类:

class Element {
  int id_;
  Position position_;
}

class Position {
  int x_;
  int y_;
}

结果实例的类型为:

class FlattenedElement {
  int id_;

  int x_;
  int y_;
}

我希望这样的行为:

Element e = new Person ( 42, new Position(0, 0) );
FlattenedElement fe = e.flatten();

是否有任何工具/库能够这样做?

或者我需要使用我接受的反射API来编写自己的flattener吗?

- 编辑大多数评论 -

我更改了我的示例以避免与Stringbyte混淆(我不必处理字符串)。

我需要在结果转换中保留数据的语义。输出原语类型数据将直接参与使用OpenCL的并行计算,OpenCL只能理解原始数据类型。

换句话说,我需要的是打破封装以直接操作嵌入在类层次结构中的原始数据类型。

3 个答案:

答案 0 :(得分:1)

您可以这样做,但您需要第三方库来创建新类,例如Javaassist。为了反思这个类是扁平化的,你将使用反射,正如一些用户已经说过的那样。这是我为你写的另一个例子:

public static Class flatten( Class classToFlatten ) {

    for ( Field f : classToFlatten.getDeclaredFields() ) {

        Class type = f.getType();
        String name = f.getName();
        int modifiersConfig = f.getModifiers();

        // extract all modifiers here (using the isXXX methods of the Modifier class)
        System.out.print( Modifier.isPrivate( modifiersConfig ) ? "private" : "" );
        System.out.print( " " + type );
        System.out.print( " " + name );
        System.out.println();

        if ( type.isPrimitive() ) {
            // primitive type.
            // does not need to be converted.
            // insert in the new class as it is (using Javaassist).
        } else {

            // no primitive type.
            // needs to be converted and tested.
            // insert in the new class after the conversion (using Javaassist).

            // convert rules...
            switch ( type.getSimpleName() ) {

                case "String":
                    // insert in the new class a array of chars.
                    break;

                // cases to test if the field is a wrapper (Integer, Long, etc.).

                // other rules tha you need here...

            }

            // here you need to use recursion...
            // you can use this method, but you will need to create
            // a new parameter, passing the class that is been built
            // to insert new fields in it (relative to the type that is been
            // reflected)

        }
    }

    // return the new class here and outside the method, use the newInstance
    // method to create new instances of this class
    return null;

}

有了这个,我想你将能够做你需要的,但我想你为什么需要这个。如果你有一些类型的数组会以递归的方式表示你会遇到一些问题,因为你可能需要“回溯”来解析它们的类型或运行flatten算法一些。使用泛型,内部类,方法和各种类成员,您将遇到同样的问题。我不是说这是不可能的,但它会消耗你很多时间,也许你可以用一些用户已经说过的更简单的方式解决你的问题。好吧,我希望你能做你需要的事情,如果可能我想知道结果!也许你的解决方案可以成为新图书馆的种子!好吧,需要头脑风暴:D这里有一些链接。

The Javaassist library can be downloaded here.

Here you can see a simple tutorial.我建议你只使用它开始,因为自教程创建以来Javaassist API可能已得到改进,因此,在阅读完之后,重构代码(如果可能的话),阅读库文档。

答案 1 :(得分:0)

好吧,从我的POV来看,一种方式就是:

public class Person {
    String name;
    Atring address;

    public FlattenedPerson flatten() {
        FlattenedPerson fp = new FlattenedPerson(this.name.getBytes(), this.houseNumber, this.address.getStreet.getBytes(), this.address.getTown.getBytes());
        return fp;
    }
}

答案 2 :(得分:0)

你必须使用反射

查看the little sample,返回Field名称。

因此,要获取此字段的值,您必须返回f[i].get(Object)