Удалите непечатный символ из Pojo в Java 8 - PullRequest
0 голосов
/ 11 сентября 2018

Я хочу удалить непечатаемый символ только для полей 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;
}

Может кто-нибудь помочь мне сделать это?

Этот вопрос может быть повторен, но я не смог найти точного решения для него.

Ответы [ 3 ]

0 голосов
/ 11 сентября 2018

Следующее работает:

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;
    }
}

Это будет работать для определенного класса (например, узла). Я пытаюсь заставить его работать с Class<T>, но сейчас оно дает какое-то исключение.

0 голосов
/ 11 сентября 2018

Вы можете сделать это, используя отражение , но это не рекомендуется: -

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 на общедоступный метод доступа.Это печатает: -

John
12

Лучше всего сделать это в получателях или установщиках полей String.

Пример: -

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

ИЛИ

public void setName(String name) {
    this.name = removeNonPrintable(name);
}
0 голосов
/ 11 сентября 2018

Вы можете использовать отражение, которое было бы проблематичным и не гарантировало бы работу для полей с глубокими структурами.

Или вы можете просто запустить экземпляр через свой код:

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

Примечание: String.valueOf() используется, чтобы не иметь дело с obj, являющимся null.

Вы могли бы добиться большего успеха, если бы вы изменили преобразование на:

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

, который удалит все , а не"обычный" символ ascii (т.е. между десятичными 32 и 126 включительно).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...