一直不太明白java的反射机制,今天稍微看了下,写了一个例子:
public static void main(String[] args) {
try {
Class clazz = Class.forName("cn.com.mysite.sink.ScalaSink");
Field[] fields = clazz.getDeclaredFields();
for(int i = 0; i < fields.length; i++) {
// 权限修饰符
int mo = fields[i].getModifiers();
String priv = Modifier.toString(mo);
// 属性类型
Class<?> type = fields[i].getType();
System.out.println(priv + " " + type.getName() + " "
+ fields[i].getName() + ";");
}
System.out.println();
System.out.println("Public fields: ");
fields = clazz.getFields();
for(int i = 0; i < fields.length; i++) {
int mo = fields[i].getModifiers();
String priv = Modifier.toString(mo);
// 属性类型
Class<?> type = fields[i].getType();
System.out.println(priv + " " + type.getName() + " "
+ fields[i].getName() + ";");
}
Method method=clazz.getDeclaredMethod("isEmpty",String.class);
method.setAccessible(true);
Object o = method.invoke((cn.com.mysite.sink.ScalaSink)clazz.newInstance(),"");
System.out.println(o);
} catch (Exception e) {
e.printStackTrace();
}
}
打印结果:
private static final org.slf4j.Logger logger;
public static final java.lang.String TOPIC_HDR;
private java.lang.String isWhite;
private java.util.Properties kafkaProps;
private java.lang.String topic;
private int batchSize;
private java.lang.String hostname;
private java.lang.String uripath;
private java.lang.String field;
private java.lang.String dataSource;
private [Ljava.lang.String; f;
private java.util.List messageList;
private org.apache.flume.sink.SinkCounter counter;
private com.ibm.tivoli.unity.common.rest.RestClient restClient;
private com.ibm.tivoli.unity.common.rest.RequestResult result;
private java.text.SimpleDateFormat df;
private java.text.SimpleDateFormat format;
private java.util.Map map;
private com.ibm.json.java.JSONObject batch;
private java.lang.StringBuilder sb;
private com.ibm.json.java.JSONObject job;
private static java.security.MessageDigest digest;
private java.util.concurrent.ExecutorService threadPool;
private long bytes;
private int _count;
private java.io.File timeFile;
private long lastSendTime;
private long sendTimeInterval;
private boolean isWrite;
private java.io.FileWriter writer;
private boolean countFlowEnable;
Public fields:
public static final java.lang.String TOPIC_HDR;
true
class里面有几个方法:getDeclaredFields();getFields(); getDeclaredMethod();getMethod();
取值不太一样,getFields()与getMethod()只能取修饰符为public的属性跟方法,而其他两个则可以取到任意的属性和方法。