我只想删除项目中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;
}
有人可以帮我做到吗?
这个问题可能是重复的,但是我没有找到确切的解决方案。
答案 0 :(得分:0)
您可以使用反射,这将是有问题的,并且不能保证适用于结构较深的字段。
或者您也可以通过代码运行实例:
public String removeNonPrintable(Object obj) {
return String.valueOf(obj).replaceAll("[^A-Za-z0-9]", "");
}
请注意:String.valueOf()
用于避免将obj
视为null
。
如果将转换更改为:
replaceAll("[^ -~]", "")
将会删除所有不是的“常规” ASCII字符(即,十进制32至126之间)。
答案 1 :(得分:0)
以下工作正常:
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>
一起使用,但是现在它提供了一些例外。
答案 2 :(得分:0)
您可以使用反射来做到这一点,但不建议这样做:-
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
一种更好的方法是在字符串字段的获取器或设置器中执行此操作。
示例:-
public String getName() {
return removeNonPrintable(name);
}
OR
public void setName(String name) {
this.name = removeNonPrintable(name);
}