繁体   English   中英

在Java 8中从Pojo中删除不可打印的字符

[英]Remove non printable character from pojo in java 8

我只想删除项目中String字段的不可打印字符,我知道我们可以使用

public String removeNonPrintable(String field) {
    return field.replaceAll("[^A-Za-z0-9]", "");
}

从字符串中删除不可打印的字符。

但我想拥有通用方法,例如:

public <T> T removeNonPrintable(Class<T> myClassObject) {
    /// Get only the string and remove non-printable code stuffs
    return removedNonPrintableCharactersmyClassObject;
}

有人可以帮我做吗?

这个问题可能是重复的,但是我没有找到确切的解决方案。

您可以使用反射,这将是有问题的,并且不能保证适用于结构较深的字段。

或者,您可以只通过代码运行实例

public String removeNonPrintable(Object obj) {
    return String.valueOf(obj).replaceAll("[^A-Za-z0-9]", "");
}

注意: String.valueOf()用于避免必须处理objnull

如果将转换更改为以下内容,则可能会获得更大的成功:

replaceAll("[^ -~]", "")

这将删除所有 “常规” ASCII字符(即,十进制的32至126之间)。

以下工作:

public static void removeNonPrintable(Node node) throws NoSuchFieldException, IllegalAccessException{
        Field[] fields = Node.class.getDeclaredFields();
        for(int i=0;i<fields.length;i++){
            if(fields[i].getType().equals(String.class)) {
                fields[i].set(node, removeNonPrintable(fields[i].get(node).toString()));
                System.out.println(fields[i].get(node));
            }
        }
    }

class Node{
     String left;
     String right;
     int data;
    public Node(String left, String right, Integer data){
        this.left = left;
        this.right = right;
        this.data = data;
    }
}

它适用于特定的类(例如Node)。 我正在尝试使其与Class<T>但是现在正在提供一些例外。

您可以使用反射来做到这一点,但不建议这样做:

public static void main(String[] args) throws IllegalAccessException {
    Person person = new Person();
    person.setName("John***");
    person.setAge(12);

    final Field[] fields = person.getClass().getDeclaredFields();
    for (Field field : fields) {
        if (field.getType() == String.class) {
            field.set(person, removeNonPrintable((String) field.get(person)));
        }
    }
    System.out.println(person.getName());
    System.out.println(person.getAge());
}

//using the regex provided by OP
private static String removeNonPrintable(String s) {
    return s.replaceAll("[^A-Za-z0-9]", "");
}

而且,您必须将String字段更改为public访问器。 打印:-

John
12

更好的方法是在String字段的getter或setter方法中执行此操作。

例:-

public String getName() {
    return removeNonPrintable(name);
}

要么

public void setName(String name) {
    this.name = removeNonPrintable(name);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM