今天看spring源码,发现这个函数,不太明白其作用,故做了个小测试:
函数代码:
public static void makeAccessible(Constructor<?> ctor) {
if ((!Modifier.isPublic(ctor.getModifiers()) || !Modifier.isPublic(ctor.getDeclaringClass().getModifiers()))
&& !ctor.isAccessible()) {
ctor.setAccessible(true);
}
}
测试代码:
package com.sail.utils.ref;
import java.lang.reflect.Constructor;
public class TestAccessible {
public static void main(String[] args) throws Exception {
Class<TestAccessibleRef> clazz=TestAccessibleRef.class;
//获取自己所有的构造函数,不包括父类得构造函数
Constructor[] conts=clazz.getDeclaredConstructors();
System.out.println("构造函数共有 "+conts.length+" 个,公共的构造函数有 "+clazz.getConstructors().length+" 个");
for(Constructor cont : conts){
System.out.println("构造函数:[{Java 语言修饰符: "+cont.getModifiers()+"},{参数长度:"+cont.getParameterTypes().length+"}," +
"{此类 "+cont.getDeclaringClass().getName()+" 的修饰符:"+cont.getDeclaringClass().getModifiers()+"},{accessible标志值:"+cont.isAccessible()+"}]");
}
}
}
abstract class superTestAccessible{
private String id;
protected superTestAccessible(){
this.id="superTestAccessibleS_ID";
}
public superTestAccessible(String id){
this.id=id;
}
}
abstract class TestAccessibleRef extends superTestAccessible{
private String name;
private String addr;
TestAccessibleRef(){
super();
this.name="TestAccessibleRef_NAME";
System.out.println("TestAccessibleRef()");
}
protected TestAccessibleRef(String name){
super();
this.name=name;
System.out.println("TestAccessibleRef(String id)");
}
public TestAccessibleRef(String id,String name){
super(id);
this.name=name;
System.out.println("TestAccessibleRef(String id,String name)");
}
private TestAccessibleRef(String id,String name,String addr){
super(id);
this.name=name;
this.addr=addr;
System.out.println("TestAccessibleRef(String id,String name,String addr)");
}
}
输出结果:
构造函数共有 4 个,公共的构造函数有 1 个
构造函数:[{Java 语言修饰符: 4},{参数长度:1},{此类 com.sail.utils.ref.TestAccessibleRef 的修饰符:1024},{accessible标志值:false}]
构造函数:[{Java 语言修饰符: 1},{参数长度:2},{此类 com.sail.utils.ref.TestAccessibleRef 的修饰符:1024},{accessible标志值:false}]
构造函数:[{Java 语言修饰符: 2},{参数长度:3},{此类 com.sail.utils.ref.TestAccessibleRef 的修饰符:1024},{accessible标志值:false}]
构造函数:[{Java 语言修饰符: 0},{参数长度:0},{此类 com.sail.utils.ref.TestAccessibleRef 的修饰符:1024},{accessible标志值:false}]
通过查阅java常量,明白相关代码的作用:
java.lang.reflect.Modifier
public static final int ABSTRACT 1024
public static final int FINAL 16
public static final int INTERFACE 512
public static final int NATIVE 256
public static final int PRIVATE 2
public static final int PROTECTED 4
public static final int PUBLIC 1
public static final int STATIC 8
public static final int STRICT 2048
public static final int SYNCHRONIZED 32
public static final int TRANSIENT 128
public static final int VOLATILE 64