当然可以,反射(Reflection)是编程语言中的一个强大特性,它允许程序在运行时检查或修改其自身结构(如类、接口、字段和方法)的行为。这种能力使得程序更加灵活和动态,尽管它也可能带来一些性能开销和复杂性。
下面是关于属性的反射:
class ReflectFiledTest {
public String PublicName;
protected String ProtectName;
private String PrivateName;
public ReflectFiledTest(String publicName) {
PublicName = publicName;
}
}
public class FieldTest {
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
//调用属性的反射方法
filedMethod();
}
public static void filedMethod() throws NoSuchFieldException, IllegalAccessException {
Class minClass= ReflectFiledTest.class;
//获取属性
/*
* public java.lang.String com.wl.reflect.ReflectFiledTest.PublicName
* 只能获取到共有的
* */
Field publicName = minClass.getField("PublicName");
// Field ProtectName = minClass.getField("ProtectName"); 错误
// Field PrivateName = minClass.getField("PrivateName"); 错误
System.out.println(publicName);
System.out.println("===================================");
/*
* public java.lang.String com.wl.reflect.ReflectFiledTest.PublicName
protected java.lang.String com.wl.reflect.ReflectFiledTest.ProtectName
private java.lang.String com.wl.reflect.ReflectFiledTest.PrivateName
* 可以输出所有类型的
*
*
* */
Field publicDecName = minClass.getDeclaredField("PublicName");
Field ProtectDecName = minClass.getDeclaredField("ProtectName");
Field PrivateDecName = minClass.getDeclaredField("PrivateName");
System.out.println(publicDecName+"\n"+ProtectDecName+"\n"+PrivateDecName);
System.out.println("===================================");
/*
*public java.lang.String com.wl.reflect.ReflectFiledTest.PublicName
* 只能获取到public
* */
Field[] fields=minClass.getFields();
for (Field field : fields) {
System.out.println(field);
}
System.out.println("===================================");
/*
*public java.lang.String com.wl.reflect.ReflectFiledTest.PublicName
protected java.lang.String com.wl.reflect.ReflectFiledTest.ProtectName
private java.lang.String com.wl.reflect.ReflectFiledTest.PrivateName
* 获取到所有的
*
* */
Field[] fields2=minClass.getDeclaredFields();
for (Field field : fields2) {
System.out.println(field);
}
System.out.println("===================================");
/*
* 输出修饰符的值
* 1: public
* 2: private
* 4: protected
* */
int modifiers = minClass.getDeclaredField("PrivateName").getModifiers();
System.out.println(modifiers);
System.out.println("===================================");
/*
*输出成员变量
* PublicName
ProtectName
PrivateName
* */
Field[] fields3=minClass.getDeclaredFields();
for (Field field : fields3) {
System.out.println(field.getName());
}
System.out.println("===================================");
/*
* 获取值并且修改值
* get() 传入要获取的对象的值
* set() 进行修改值 传入要修改的对象,已经要被需修改的内容。
* */
ReflectFiledTest reflectFiledTest = new ReflectFiledTest("innerPublicName");
String publicName1 = (String) reflectFiledTest.getClass().getField("PublicName").get(reflectFiledTest);
System.out.println(publicName1);
reflectFiledTest.getClass().getField("PublicName").set(reflectFiledTest, "innerPublicName2");
String publicName2 = (String) reflectFiledTest.getClass().getField("PublicName").get(reflectFiledTest);
System.out.println(publicName2);
}
}
以下是关于方法的反射用法
自定义个注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Inherited
public @interface TestAnno {
String value() default "默认的value";
}
class ReflectMethodTest {
public String PublicName;
protected String ProtectName;
private String PrivateName;
public ReflectMethodTest(String publicName) {
PublicName = publicName;
}
@TestAnno(value = "set template")
public void setPublicName(String publicName) {
PublicName = publicName;
}
@TestAnno(value="get template")
protected String getProtectName() {
return ProtectName;
}
private String getPrivateName() {
return PrivateName;
}
@TestAnno(value = "即将输出我")
public String output(String xx){
return xx;
}
}
public class MethodTest {
public static void main(String[] args) throws Exception {
reflectMethod();
}
private static void reflectMethod() throws Exception {
Class aClass = ReflectMethodTest.class;
/*
*
* declare 可以获取到所有修饰符的变量
* public com.wl.reflect.ReflectMethodTest(java.lang.String)
public void com.wl.reflect.ReflectMethodTest.setPublicName(java.lang.String)
protected java.lang.String com.wl.reflect.ReflectMethodTest.getProtectName()
private java.lang.String com.wl.reflect.ReflectMethodTest.getPrivateName()
*
* */
Constructor constructor = aClass.getConstructor(String.class);
System.out.println(constructor);
Method reflectMethodTest = aClass.getDeclaredMethod("setPublicName", String.class);
Method getProtectName = aClass.getDeclaredMethod("getProtectName");
Method getPrivateName = aClass.getDeclaredMethod("getPrivateName");
System.out.println(reflectMethodTest);
System.out.println(getProtectName);
System.out.println(getPrivateName);
System.out.println("========================================");
/*
* getMethod 只能获取到public修饰的变量
* */
Method reflectMethodTest2 = aClass.getMethod("setPublicName", String.class);
System.out.println(reflectMethodTest2);
System.out.println("========================================");
/*
*
* 获取到所有的public方法
* public void com.wl.reflect.ReflectMethodTest.setPublicName(java.lang.String)
public final void java.lang.Object.wait() throws java.lang.InterruptedException
public final void java.lang.Object.wait(long,int) throws java.lang.InterruptedException
public final native void java.lang.Object.wait(long) throws java.lang.InterruptedException
public boolean java.lang.Object.equals(java.lang.Object)
public java.lang.String java.lang.Object.toString()
public native int java.lang.Object.hashCode()
public final native java.lang.Class java.lang.Object.getClass()
public final native void java.lang.Object.notify()
public final native void java.lang.Object.notifyAll()
* */
Method[] methods = aClass.getMethods();
Arrays.stream(methods)
.forEach(System.out::println);
System.out.println("========================================");
/*
* 获取到所有类型的方法(当前类额外编写的)
* protected java.lang.String com.wl.reflect.ReflectMethodTest.getProtectName()
private java.lang.String com.wl.reflect.ReflectMethodTest.getPrivateName()
public void com.wl.reflect.ReflectMethodTest.setPublicName(java.lang.String)
*
*
* */
Method[] declaredMethods = aClass.getDeclaredMethods();
Arrays.stream(declaredMethods)
.forEach(System.out::println);
System.out.println("========================================");
/*
* 输出对应参数
*java.lang.String arg0
* */
Parameter[] getProtectNames = aClass.getDeclaredMethod("setPublicName", String.class).getParameters();
Arrays.stream(getProtectNames).forEach(s-> System.out.println(s));
System.out.println("========================================");
/*
* 获取到返回类型
* */
Class<?> getPrivateName1 = aClass.getDeclaredMethod("getPrivateName").getReturnType();
System.out.println(getPrivateName1);
System.out.println("========================================");
/*
* 获取携带注解的方法,输出注解的信息
* getProtectName注解为:get template
getPrivateName注解为:null
setPublicName注解为:set template
* */
Method[] declaredMethods1 = aClass.getDeclaredMethods();
for (Method m: declaredMethods1){
TestAnno annotation = m.getAnnotation(TestAnno.class);
if(annotation==null){
//没有注解,输出方法名+null
System.out.println(m.getName()+"注解为:"+null);
}else{
//输出注解加注解的当前值
System.out.println(m.getName()+"注解为:"+annotation.value());
}
}
System.out.println("========================================");
/*
* 输出注解外,通过invoke进行修改
*注解内容=即将输出我
对象默认值=
反射干预后
修改后的值
* */
Method output = aClass.getDeclaredMethod("output",String.class);
System.out.println("注解内容="+output.getAnnotation(TestAnno.class).value());
ReflectMethodTest reflectMethodTest1 = new ReflectMethodTest("ss");
System.out.println("对象默认值="+reflectMethodTest1.output(""));
System.out.println("反射干预后");
String text =(String) output.invoke(reflectMethodTest1, "修改后的值");
System.out.println(text);
// System.out.println("对象默认值="+reflectMethodTest1.output());
}
}