mirror of
https://github.com/Estom/notes.git
synced 2026-02-07 12:35:20 +08:00
Java内容重新整理删除过期的东西
This commit is contained in:
143
Java/JavaDemo/codedemo/java/lang/reflect/ClassAnalyze.java
Normal file
143
Java/JavaDemo/codedemo/java/lang/reflect/ClassAnalyze.java
Normal file
@@ -0,0 +1,143 @@
|
||||
package cn.aofeng.demo.java.lang.reflect;
|
||||
|
||||
import java.lang.annotation.Annotation;
|
||||
import java.lang.reflect.AnnotatedElement;
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.lang.reflect.Field;
|
||||
import java.lang.reflect.Member;
|
||||
import java.lang.reflect.Method;
|
||||
import java.lang.reflect.Modifier;
|
||||
|
||||
/**
|
||||
* 通过反射获取类的构造方法、字段、方法和注解等信息。
|
||||
*
|
||||
* @author <a href="mailto:aofengblog@163.com">聂勇</a>
|
||||
*/
|
||||
public class ClassAnalyze {
|
||||
|
||||
final static String PREFIX = "==========";
|
||||
final static String SUFFIX = PREFIX;
|
||||
|
||||
private static void parseClass(Class<?> claz) {
|
||||
// 注解
|
||||
parseAnnotation(claz);
|
||||
|
||||
// 类
|
||||
StringBuilder buffer = new StringBuilder(32)
|
||||
.append( Modifier.toString(claz.getModifiers()) )
|
||||
.append(' ')
|
||||
.append(claz.getName());
|
||||
log(buffer.toString());
|
||||
}
|
||||
|
||||
private static void parseConstructor(Constructor<?> c) {
|
||||
// 注解
|
||||
parseAnnotation(c);
|
||||
|
||||
// 构造方法
|
||||
StringBuilder buffer = new StringBuilder(32)
|
||||
.append( parseMember(c) )
|
||||
.append('(');
|
||||
|
||||
// 参数
|
||||
Class<?>[] params = c.getParameterTypes();
|
||||
for (int index = 0; index < params.length; index++) {
|
||||
buffer.append(params[index].getName());
|
||||
if (index!=params.length-1) {
|
||||
buffer.append(", ");
|
||||
}
|
||||
}
|
||||
buffer.append(')');
|
||||
|
||||
log(buffer.toString());
|
||||
}
|
||||
|
||||
private static void parseMethod(Method method) {
|
||||
// 注解
|
||||
parseAnnotation(method);
|
||||
|
||||
// 方法
|
||||
StringBuilder buffer = new StringBuilder(32)
|
||||
.append( parseMember(method) )
|
||||
.append('(');
|
||||
|
||||
// 参数
|
||||
Class<?>[] params = method.getParameterTypes();
|
||||
for (int index = 0; index < params.length; index++) {
|
||||
buffer.append(params[index].getName());
|
||||
if (index!=params.length-1) {
|
||||
buffer.append(", ");
|
||||
}
|
||||
}
|
||||
buffer.append(')');
|
||||
|
||||
log(buffer.toString());
|
||||
}
|
||||
|
||||
private static void parseField(Field field) {
|
||||
// 注解
|
||||
parseAnnotation(field);
|
||||
|
||||
// 字段
|
||||
StringBuilder buffer = parseMember(field);
|
||||
log(buffer.toString());
|
||||
}
|
||||
|
||||
/**
|
||||
* 解析方法、字段或构造方法的信息。
|
||||
* @param member 方法、字段或构造方法
|
||||
* @return 修饰符和名称组成的字符串。
|
||||
*/
|
||||
private static StringBuilder parseMember(Member member) {
|
||||
StringBuilder buffer = new StringBuilder()
|
||||
.append(Modifier.toString(member.getModifiers()))
|
||||
.append(' ')
|
||||
.append(member.getName());
|
||||
return buffer;
|
||||
}
|
||||
|
||||
/**
|
||||
* 解析注解信息。
|
||||
*/
|
||||
private static void parseAnnotation(AnnotatedElement ae) {
|
||||
Annotation[] ans = ae.getDeclaredAnnotations();
|
||||
for (Annotation annotation : ans) {
|
||||
log(annotation.toString());
|
||||
}
|
||||
}
|
||||
|
||||
public static void log(String msg, Object... param) {
|
||||
System.out.println( String.format(msg, param) );
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws ClassNotFoundException {
|
||||
if (args.length != 1) {
|
||||
log("无效的输入参数!");
|
||||
log("示例:");
|
||||
log("java cn.aofeng.demo.java.lang.reflect.ClassAnalyze java.util.HashMap");
|
||||
}
|
||||
Class<?> claz = Class.forName(args[0]);
|
||||
|
||||
log("%s类%s", PREFIX, SUFFIX);
|
||||
parseClass(claz);
|
||||
|
||||
log("%s构造方法%s", PREFIX, SUFFIX);
|
||||
Constructor<?>[] cs = claz.getDeclaredConstructors();
|
||||
for (Constructor<?> constructor : cs) {
|
||||
parseConstructor(constructor);
|
||||
}
|
||||
|
||||
log("%s字段%s", PREFIX, SUFFIX);
|
||||
Field[] fields = claz.getDeclaredFields();
|
||||
for (Field field : fields) {
|
||||
parseField(field);
|
||||
}
|
||||
|
||||
log("%s方法%s", PREFIX, SUFFIX);
|
||||
Method[] methods = claz.getDeclaredMethods();
|
||||
for (Method method : methods) {
|
||||
parseMethod(method);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
36
Java/JavaDemo/codedemo/java/lang/reflect/CreateInstance.java
Normal file
36
Java/JavaDemo/codedemo/java/lang/reflect/CreateInstance.java
Normal file
@@ -0,0 +1,36 @@
|
||||
package cn.aofeng.demo.java.lang.reflect;
|
||||
|
||||
import java.lang.reflect.Constructor;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
|
||||
import cn.aofeng.demo.util.LogUtil;
|
||||
|
||||
/**
|
||||
* 通过反射使用构造方法创建对象实例。
|
||||
*
|
||||
* @author <a href="mailto:aofengblog@163.com">聂勇</a>
|
||||
*/
|
||||
public class CreateInstance {
|
||||
|
||||
public static void main(String[] args) throws InstantiationException, IllegalAccessException,
|
||||
NoSuchMethodException, SecurityException,
|
||||
IllegalArgumentException, InvocationTargetException {
|
||||
Class<Man> claz = Man.class;
|
||||
|
||||
// 调用默认的public构造方法
|
||||
Man man = claz.newInstance();
|
||||
LogUtil.log(man.toString());
|
||||
|
||||
// 调用带参数的protected构造方法
|
||||
Constructor<Man> manC = claz.getDeclaredConstructor(String.class);
|
||||
man = manC.newInstance("aofeng");
|
||||
LogUtil.log(man.toString());
|
||||
|
||||
// 调用带参数的private构造方法
|
||||
manC = claz.getDeclaredConstructor(String.class, int.class);
|
||||
manC.setAccessible(true);
|
||||
man = manC.newInstance("NieYong", 32);
|
||||
LogUtil.log(man.toString());
|
||||
}
|
||||
|
||||
}
|
||||
37
Java/JavaDemo/codedemo/java/lang/reflect/InvokeField.java
Normal file
37
Java/JavaDemo/codedemo/java/lang/reflect/InvokeField.java
Normal file
@@ -0,0 +1,37 @@
|
||||
package cn.aofeng.demo.java.lang.reflect;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
|
||||
import static cn.aofeng.demo.util.LogUtil.log;
|
||||
|
||||
/**
|
||||
* 通过反射设置字段。
|
||||
*
|
||||
* @author <a href="mailto:aofengblog@163.com">聂勇</a>
|
||||
*/
|
||||
public class InvokeField {
|
||||
|
||||
public static void main(String[] args) throws NoSuchFieldException,
|
||||
SecurityException, IllegalArgumentException, IllegalAccessException {
|
||||
Man man = new Man();
|
||||
Class<?> claz = man.getClass();
|
||||
|
||||
log("==========设置public字段的值==========");
|
||||
log("height的值:%d", man.height);
|
||||
Field field = claz.getField("height");
|
||||
field.setInt(man, 175);
|
||||
log("height的值:%d", man.height);
|
||||
|
||||
log("==========设置private字段的值==========");
|
||||
log("power的值:%d", man.getPower());
|
||||
field = claz.getDeclaredField("power");
|
||||
field.setAccessible(true);
|
||||
field.setInt(man, 100);
|
||||
log("power的值:%d", man.getPower());
|
||||
|
||||
log("==========获取private字段的值==========");
|
||||
int power = field.getInt(man);
|
||||
log("power的值:%d", power);
|
||||
}
|
||||
|
||||
}
|
||||
84
Java/JavaDemo/codedemo/java/lang/reflect/InvokeMethod.java
Normal file
84
Java/JavaDemo/codedemo/java/lang/reflect/InvokeMethod.java
Normal file
@@ -0,0 +1,84 @@
|
||||
package cn.aofeng.demo.java.lang.reflect;
|
||||
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.lang.reflect.Method;
|
||||
|
||||
import static cn.aofeng.demo.util.LogUtil.log;
|
||||
|
||||
/**
|
||||
* 通过反射调用方法。
|
||||
*
|
||||
* @author <a href="mailto:aofengblog@163.com">聂勇</a>
|
||||
*/
|
||||
public class InvokeMethod {
|
||||
|
||||
/**
|
||||
* 调用父类的方法。
|
||||
*
|
||||
* @param claz
|
||||
* 类
|
||||
* @param man
|
||||
* 类对应的实例
|
||||
*/
|
||||
private static void invokeParentMethod(Class<Man> claz, Man man)
|
||||
throws NoSuchMethodException, IllegalAccessException,
|
||||
InvocationTargetException {
|
||||
// 调用父类的public方法
|
||||
Method method = claz.getMethod("setName", String.class);
|
||||
method.invoke(man, "NieYong");
|
||||
log(man.toString());
|
||||
|
||||
method = claz.getMethod("getName");
|
||||
Object result = method.invoke(man);
|
||||
log("name:%s", result);
|
||||
|
||||
// 调用父类的private方法
|
||||
method = claz.getSuperclass().getDeclaredMethod("reset");
|
||||
method.setAccessible(true);
|
||||
result = method.invoke(man);
|
||||
log(man.toString());
|
||||
}
|
||||
|
||||
/**
|
||||
* 调用自身的方法。
|
||||
*
|
||||
* @param claz
|
||||
* 类
|
||||
* @param man
|
||||
* 类对应的实例
|
||||
*/
|
||||
private static void invokeSelfMethod(Class<Man> claz, Man man)
|
||||
throws NoSuchMethodException, IllegalAccessException,
|
||||
InvocationTargetException {
|
||||
man.setName("XiaoMing");
|
||||
// 调用自身的private方法
|
||||
Method method = claz.getDeclaredMethod("setPower", int.class);
|
||||
method.setAccessible(true);
|
||||
method.invoke(man, 99);
|
||||
log("power:%d", man.getPower());
|
||||
|
||||
// 调用自身的public方法
|
||||
log("%s is marry:%s", man.getName(), (man.isMarry() ? "Yes" : "No"));
|
||||
method = claz.getDeclaredMethod("setMarry", boolean.class);
|
||||
method.invoke(man, true);
|
||||
log("%s is marry:%s", man.getName(), (man.isMarry() ? "Yes" : "No"));
|
||||
|
||||
// 调用静态方法,可将实例设置为null,因为静态方法属于类
|
||||
Man a = new Man("张三");
|
||||
Man b = new Man("李四");
|
||||
method = claz.getMethod("fight", Man.class, Man.class);
|
||||
method.invoke(null, a, b); //
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws NoSuchMethodException,
|
||||
SecurityException, IllegalAccessException,
|
||||
IllegalArgumentException, InvocationTargetException,
|
||||
InstantiationException {
|
||||
Class<Man> claz = Man.class;
|
||||
Man man = claz.newInstance();
|
||||
|
||||
invokeParentMethod(claz, man);
|
||||
invokeSelfMethod(claz, man);
|
||||
}
|
||||
|
||||
}
|
||||
63
Java/JavaDemo/codedemo/java/lang/reflect/Man.java
Normal file
63
Java/JavaDemo/codedemo/java/lang/reflect/Man.java
Normal file
@@ -0,0 +1,63 @@
|
||||
package cn.aofeng.demo.java.lang.reflect;
|
||||
|
||||
import cn.aofeng.demo.json.gson.Person;
|
||||
import cn.aofeng.demo.util.LogUtil;
|
||||
|
||||
/**
|
||||
* 男人。
|
||||
*
|
||||
* @author <a href="mailto:aofengblog@163.com">聂勇</a>
|
||||
*/
|
||||
public class Man extends Person {
|
||||
|
||||
private boolean marry;
|
||||
|
||||
private int power;
|
||||
|
||||
public int height;
|
||||
|
||||
public Man() {
|
||||
super();
|
||||
LogUtil.log("%s的默认构造方法被调用", Man.class.getName());
|
||||
}
|
||||
|
||||
protected Man(String name) {
|
||||
super(name, 0);
|
||||
LogUtil.log("%s带name参数的构造方法被调用", Man.class.getName());
|
||||
}
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
private Man(String name, int age) {
|
||||
super(name, age);
|
||||
LogUtil.log("%s带name和age参数的构造方法被调用", Man.class.getName());
|
||||
}
|
||||
|
||||
public static void fight(Man a, Man b) {
|
||||
String win = "unkown";
|
||||
if (a.power > b.power) {
|
||||
win = a.getName();
|
||||
} else if (b.power > a.power) {
|
||||
win = a.getName();
|
||||
}
|
||||
|
||||
LogUtil.log("%s vs %s, fight result:%s", a.getName(), b.getName(), win);
|
||||
}
|
||||
|
||||
public boolean isMarry() {
|
||||
return marry;
|
||||
}
|
||||
|
||||
public void setMarry(boolean marry) {
|
||||
this.marry = marry;
|
||||
}
|
||||
|
||||
public int getPower() {
|
||||
return power;
|
||||
}
|
||||
|
||||
@SuppressWarnings("unused")
|
||||
private void setPower(int power) {
|
||||
this.power = power;
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user