JDK錛歫dk1.7.0_02CGLIB鍒涘緩浠g悊瀵硅薄閫熷害澶ф姣擩DK Proxy鎱?鍊嶏紝鎵ц閫熷害鏄疛DK Proxy鐨?鍊嶄互涓?/span>
CGLIB錛氬拰spring2.0.6 浣跨敤鍚屾牱鐨刢glib-nodep-2.1_3.jar
CPU錛歅8400 2.53GHz 2.53GHz
嫻嬭瘯緇撴灉4錛?nbsp;Create JDK Proxy: 43 ms
Create CGLIB Proxy: 129 ms
Run JDK Proxy: 940 ms, 1,500,069 t/s
Run CGLIB Proxy: 299 ms, 4,715,937 t/s
鍦ㄤ竴鑸殑Java寮鍙戜腑錛屾渶甯告帴瑙﹀埌鐨勫彲鑳藉氨鏄?a style="text-decoration: none; color: #286ab2; outline: none !important; margin: 0px; border: 0px; padding: 0px;">@Override鍜?a style="text-decoration: none; color: #286ab2; outline: none !important; margin: 0px; border: 0px; padding: 0px;">@SupressWarnings榪欎袱涓敞瑙d簡(jiǎn)銆備嬌鐢ˊOverride鐨勬椂鍊欏彧闇瑕佷竴涓畝鍗曠殑澹版槑鍗沖彲銆傝繖縐嶇О涓烘爣璁版敞瑙o紙marker annotation 錛夛紝瀹冪殑鍑虹幇灝變唬琛ㄤ簡(jiǎn)鏌愮閰嶇疆璇箟銆傝屽叾瀹冪殑娉ㄨВ鏄彲浠ユ湁鑷繁鐨勯厤緗弬鏁扮殑銆傞厤緗弬鏁頒互鍚嶅煎鐨勬柟寮忓嚭鐜般備嬌鐢?@SupressWarnings鐨勬椂鍊欓渶瑕佺被浼粿SupressWarnings({"uncheck", "unused"})榪欐牱鐨勮娉曘傚湪鎷彿閲岄潰鐨勬槸璇ユ敞瑙e彲渚涢厤緗殑鍊箋傜敱浜庤繖涓敞瑙e彧鏈変竴涓厤緗弬鏁幫紝璇ュ弬鏁扮殑鍚嶇О榛樿涓簐alue錛屽茍涓斿彲浠ョ渷鐣ャ傝岃姳鎷彿鍒欒〃紺烘槸鏁扮粍綾誨瀷銆傚湪JPA涓殑@Table娉ㄨВ浣跨敤綾諱技@Table(name = "Customer", schema = "APP")榪欐牱鐨勮娉曘備粠榪欓噷鍙互鐪嬪埌鍚嶅煎鐨勭敤娉曘傚湪浣跨敤娉ㄨВ鏃跺欑殑閰嶇疆鍙傛暟鐨勫煎繀欏繪槸緙栬瘧鏃跺埢鐨勫父閲忋?/p>
浠庢煇縐嶈搴︽潵璇達(dá)紝鍙互鎶婃敞瑙g湅鎴愭槸涓涓猉ML鍏冪礌錛岃鍏冪礌鍙互鏈変笉鍚岀殑棰勫畾涔夌殑灞炴с傝屽睘鎬х殑鍊兼槸鍙互鍦ㄥ0鏄庤鍏冪礌鐨勬椂鍊欒嚜琛屾寚瀹氱殑銆傚湪浠g爜涓嬌鐢ㄦ敞瑙o紝灝辯浉褰撲簬鎶婁竴閮ㄥ垎鍏冩暟鎹粠XML鏂囦歡縐誨埌浜?jiǎn)浠g爜鏈w箣涓紝鍦ㄤ竴涓湴鏂圭鐞嗗拰緇存姢銆?/p>
鍦ㄤ竴鑸殑寮鍙戜腑錛屽彧闇瑕侀氳繃闃呰鐩稿叧鐨凙PI鏂囨。鏉ヤ簡(jiǎn)瑙f瘡涓敞瑙g殑閰嶇疆鍙傛暟鐨勫惈涔夛紝騫跺湪浠g爜涓紜嬌鐢ㄥ嵆鍙傚湪鏈変簺鎯呭喌涓嬶紝鍙兘浼?xì)闇瑕佸紑鍙戣嚜宸辯殑娉ㄨВ銆傝繖鍦ㄥ簱鐨勫紑鍙戜腑姣旇緝甯歌銆傛敞瑙g殑瀹氫箟鏈夌偣綾諱技鎺ュ彛銆備笅闈㈢殑浠g爜緇欏嚭浜?jiǎn)涓涓畝鍗曠殑鎻忚堪浠g爜鍒嗗伐瀹夋帓鐨勬敞瑙c傞氳繃璇ユ敞瑙e彲浠ュ湪婧愪唬鐮佷腑璁板綍姣忎釜綾繪垨鎺ュ彛鐨勫垎宸ュ拰榪涘害鎯呭喌銆?br />
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface Assignment { String assignee(); int effort(); double finished() default 0; }
@interface鐢ㄦ潵澹版槑涓涓敞瑙o紝鍏朵腑鐨勬瘡涓涓柟娉曞疄闄呬笂鏄0鏄庝簡(jiǎn)涓涓厤緗弬鏁般傛柟娉曠殑鍚嶇О灝辨槸鍙傛暟鐨勫悕縐幫紝榪斿洖鍊肩被鍨嬪氨鏄弬鏁扮殑綾誨瀷銆傚彲浠ラ氳繃default鏉ュ0鏄庡弬鏁扮殑榛樿鍊箋傚湪榪欓噷鍙互鐪嬪埌@Retention鍜?a style="text-decoration: none; color: #286ab2; margin: 0px; border: 0px; padding: 0px; outline: none !important;">@Target榪欐牱鐨勫厓娉ㄨВ錛岀敤鏉ュ0鏄庢敞瑙f湰韜殑琛屼負(fù)銆侤Retention鐢ㄦ潵澹版槑娉ㄨВ鐨勪繚鐣欑瓥鐣ワ紝鏈?a style="text-decoration: none; color: #286ab2; margin: 0px; border: 0px; padding: 0px; outline: none !important;">CLASS銆?a style="text-decoration: none; color: #286ab2; margin: 0px; border: 0px; padding: 0px; outline: none !important;">RUNTIME鍜?a style="text-decoration: none; color: #286ab2; margin: 0px; border: 0px; padding: 0px; outline: none !important;">SOURCE榪欎笁縐嶏紝鍒嗗埆琛ㄧず娉ㄨВ淇濆瓨鍦ㄧ被鏂囦歡銆丣VM榪愯鏃跺埢鍜屾簮浠g爜涓傚彧鏈夊綋澹版槑涓篟UNTIME鐨勬椂鍊欙紝鎵嶈兘澶熷湪榪愯鏃跺埢閫氳繃鍙嶅皠API鏉ヨ幏鍙栧埌娉ㄨВ鐨勪俊鎭侤Target鐢ㄦ潵澹版槑娉ㄨВ鍙互琚坊鍔犲湪鍝簺綾誨瀷鐨勫厓绱犱笂錛屽綾誨瀷銆佹柟娉曞拰鍩熺瓑銆?/p>
鍦ㄧ▼搴忎腑娣誨姞鐨勬敞瑙o紝鍙互鍦ㄧ紪璇戞椂鍒繪垨鏄繍琛屾椂鍒繪潵榪涜澶勭悊銆傚湪緙栬瘧鏃跺埢澶勭悊鐨勬椂鍊欙紝鏄垎鎴愬瓚熸潵榪涜鐨勩傚鏋滃湪鏌愯稛澶勭悊涓駭鐢熶簡(jiǎn)鏂扮殑Java婧愭枃浠訛紝閭d箞灝遍渶瑕佸彟澶栦竴瓚熷鐞嗘潵澶勭悊鏂扮敓鎴愮殑婧愭枃浠躲傚姝ゅ線澶嶏紝鐩村埌娌℃湁鏂版枃浠惰鐢熸垚涓烘銆傚湪瀹屾垚澶勭悊涔嬪悗錛屽啀瀵笿ava浠g爜榪涜緙栬瘧銆侸DK 5涓彁渚涗簡(jiǎn)apt宸ュ叿鐢ㄦ潵瀵規(guī)敞瑙h繘琛屽鐞嗐俛pt鏄竴涓懡浠よ宸ュ叿錛屼笌涔嬮厤濂楃殑榪樻湁涓濂楃敤鏉ユ弿榪扮▼搴忚涔夌粨鏋勭殑Mirror API銆侻irror API錛坈om.sun.mirror.*錛夋弿榪扮殑鏄▼搴忓湪緙栬瘧鏃跺埢鐨勯潤(rùn)鎬佺粨鏋勩傞氳繃Mirror API鍙互鑾峰彇鍒拌娉ㄨВ鐨凧ava綾誨瀷鍏冪礌鐨勪俊鎭紝浠庤屾彁渚涚浉搴旂殑澶勭悊閫昏緫銆傚叿浣撶殑澶勭悊宸ヤ綔浜ょ粰apt宸ュ叿鏉ュ畬鎴愩傜紪鍐欐敞瑙e鐞嗗櫒鐨勬牳蹇?jī)鏄?a style="text-decoration: none; color: #286ab2; outline: none !important; margin: 0px; border: 0px; padding: 0px;">AnnotationProcessorFactory鍜?a style="text-decoration: none; color: #286ab2; outline: none !important; margin: 0px; border: 0px; padding: 0px;">AnnotationProcessor涓や釜鎺ュ彛銆傚悗鑰呰〃紺虹殑鏄敞瑙e鐞嗗櫒錛岃屽墠鑰呭垯鏄負(fù)鏌愪簺娉ㄨВ綾誨瀷鍒涘緩娉ㄨВ澶勭悊鍣ㄧ殑宸ュ巶銆?/p>
浠ヤ笂闈㈢殑娉ㄨВAssignment涓轟緥錛屽綋姣忎釜寮鍙戜漢鍛橀兘鍦ㄦ簮浠g爜涓洿鏂拌繘搴︾殑璇濓紝灝卞彲浠ラ氳繃涓涓敞瑙e鐞嗗櫒鏉ョ敓鎴愪竴涓」鐩暣浣撹繘搴︾殑鎶ュ憡銆?棣栧厛鏄敞瑙e鐞嗗櫒宸ュ巶鐨勫疄鐜般?br />
public class AssignmentApf implements AnnotationProcessorFactory { public AnnotationProcessor getProcessorFor(Set<AnnotationTypeDeclaration> atds,? AnnotationProcessorEnvironment env) { if (atds.isEmpty()) { return AnnotationProcessors.NO_OP; } return new AssignmentAp(env); //榪斿洖娉ㄨВ澶勭悊鍣? } public Collection<String> supportedAnnotationTypes() { return Collections.unmodifiableList(Arrays.asList("annotation.Assignment")); } public Collection<String> supportedOptions() { return Collections.emptySet(); } }
AnnotationProcessorFactory鎺ュ彛鏈変笁涓柟娉曪細(xì)getProcessorFor鏄牴鎹敞瑙g殑綾誨瀷鏉ヨ繑鍥炵壒瀹氱殑娉ㄨВ澶勭悊鍣紱supportedAnnotationTypes鏄繑鍥炶宸ュ巶鐢熸垚鐨勬敞瑙e鐞嗗櫒鎵鑳芥敮鎸佺殑娉ㄨВ綾誨瀷錛泂upportedOptions鐢ㄦ潵琛ㄧず鎵鏀寔鐨勯檮鍔犻夐」銆傚湪榪愯apt鍛戒護(hù)琛屽伐鍏風(fēng)殑鏃跺欙紝鍙互閫氳繃-A鏉ヤ紶閫掗澶栫殑鍙傛暟緇欐敞瑙e鐞嗗櫒錛屽-Averbose=true銆傚綋宸ュ巶閫氳繃 supportedOptions鏂規(guī)硶澹版槑浜?jiǎn)鎵鑳借瘑鍒殑闄勫姞閫夐」涔嬪悗錛屾敞瑙e鐞嗗櫒灝卞彲浠ュ湪榪愯鏃跺埢閫氳繃AnnotationProcessorEnvironment鐨刧etOptions鏂規(guī)硶鑾峰彇鍒伴夐」鐨勫疄闄呭箋傛敞瑙e鐞嗗櫒鏈韓鐨勫熀鏈疄鐜板涓嬫墍紺恒?br />
public class AssignmentAp implements AnnotationProcessor { private AnnotationProcessorEnvironment env; private AnnotationTypeDeclaration assignmentDeclaration; public AssignmentAp(AnnotationProcessorEnvironment env) { this.env = env; assignmentDeclaration = (AnnotationTypeDeclaration) env.getTypeDeclaration("annotation.Assignment"); } public void process() { Collection<Declaration> declarations = env.getDeclarationsAnnotatedWith(assignmentDeclaration); for (Declaration declaration : declarations) { processAssignmentAnnotations(declaration); } } private void processAssignmentAnnotations(Declaration declaration) { Collection<AnnotationMirror> annotations = declaration.getAnnotationMirrors(); for (AnnotationMirror mirror : annotations) { if (mirror.getAnnotationType().getDeclaration().equals(assignmentDeclaration)) { Map<AnnotationTypeElementDeclaration, AnnotationValue> values = mirror.getElementValues(); String assignee = (String) getAnnotationValue(values, "assignee"); //鑾峰彇娉ㄨВ鐨勫? } } } }
娉ㄨВ澶勭悊鍣ㄧ殑澶勭悊閫昏緫閮藉湪process鏂規(guī)硶涓畬鎴愩傞氳繃涓涓0鏄庯紙Declaration錛夌殑getAnnotationMirrors鏂規(guī)硶灝卞彲浠ヨ幏鍙栧埌璇ュ0鏄庝笂鎵娣誨姞鐨勬敞瑙g殑瀹為檯鍊箋傚緱鍒拌繖浜涘間箣鍚庯紝澶勭悊璧鋒潵灝變笉闅句簡(jiǎn)銆?/p>
鍦ㄥ垱寤哄ソ娉ㄨВ澶勭悊鍣ㄤ箣鍚庯紝灝卞彲浠ラ氳繃apt鍛戒護(hù)琛屽伐鍏鋒潵瀵規(guī)簮浠g爜涓殑娉ㄨВ榪涜澶勭悊銆?鍛戒護(hù)鐨勮繍琛屾牸寮忔槸apt -classpath bin -factory annotation.apt.AssignmentApf src/annotation/work/*.java錛屽嵆閫氳繃-factory鏉ユ寚瀹氭敞瑙e鐞嗗櫒宸ュ巶綾葷殑鍚嶇О銆傚疄闄呬笂錛宎pt宸ュ叿鍦ㄥ畬鎴愬鐞嗕箣鍚庯紝浼?xì)鑷姩璋冪敤javac鏉ョ紪璇戝鐞嗗畬鎴愬悗鐨勬簮浠g爜銆?/p>
JDK 5涓殑apt宸ュ叿鐨勪笉瓚充箣澶勫湪浜庡畠鏄疧racle鎻愪緵鐨勭鏈夊疄鐜般傚湪JDK 6涓紝閫氳繃JSR 269鎶婅嚜瀹氫箟娉ㄨВ澶勭悊鍣ㄨ繖涓鍔熻兘榪涜浜?jiǎn)瑙勮寖鍖栧Q屾湁浜?jiǎn)鏂扮?a style="text-decoration: none; color: #286ab2; outline: none !important; margin: 0px; border: 0px; padding: 0px;">javax.annotation.processing榪欎釜鏂扮殑API銆傚Mirror API涔熻繘琛屼簡(jiǎn)鏇存柊錛屽艦鎴愪簡(jiǎn)鏂扮殑javax.lang.model鍖呫傛敞瑙e鐞嗗櫒鐨勪嬌鐢ㄤ篃榪涜浜?jiǎn)绠鍖栵紝涓嶉渶瑕佸啀鍗曠嫭榪愯apt榪欐牱鐨勫懡浠よ宸ュ叿錛孞ava緙栬瘧鍣ㄦ湰韜氨鍙互瀹屾垚瀵規(guī)敞瑙g殑澶勭悊銆傚浜庡悓鏍風(fēng)殑鍔熻兘錛屽鏋滅敤JSR 269鐨勫仛娉曪紝鍙渶瑕佷竴涓被灝卞彲浠ヤ簡(jiǎn)銆?br />
@SupportedSourceVersion(SourceVersion.RELEASE_6) @SupportedAnnotationTypes("annotation.Assignment") public class AssignmentProcess extends AbstractProcessor { private TypeElement assignmentElement; public synchronized void init(ProcessingEnvironment processingEnv) { super.init(processingEnv); Elements elementUtils = processingEnv.getElementUtils(); assignmentElement = elementUtils.getTypeElement("annotation.Assignment"); } public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment roundEnv) { Set<? extends Element> elements = roundEnv.getElementsAnnotatedWith(assignmentElement); for (Element element : elements) { processAssignment(element); } } private void processAssignment(Element element) { List<? extends AnnotationMirror> annotations = element.getAnnotationMirrors(); for (AnnotationMirror mirror : annotations) { if (mirror.getAnnotationType().asElement().equals(assignmentElement)) { Map<? extends ExecutableElement, ? extends AnnotationValue> values = mirror.getElementValues(); String assignee = (String) getAnnotationValue(values, "assignee"); //鑾峰彇娉ㄨВ鐨勫? } } } }
浠旂粏姣旇緝涓婇潰涓ゆ浠g爜錛屽彲浠ュ彂鐜板畠浠殑鍩烘湰緇撴瀯鏄被浼肩殑銆備笉鍚屼箣澶勫湪浜嶫DK 6涓氳繃鍏冩敞瑙?a style="text-decoration: none; color: #286ab2; outline: none !important; margin: 0px; border: 0px; padding: 0px;">@SupportedAnnotationTypes鏉ュ0鏄庢墍鏀寔鐨勬敞瑙g被鍨嬨傚彟澶栨弿榪扮▼搴忛潤(rùn)鎬佺粨鏋勭殑javax.lang.model鍖呬嬌鐢ㄤ簡(jiǎn)涓嶅悓鐨勭被鍨嬪悕縐般備嬌鐢ㄧ殑鏃跺欎篃鏇村姞綆鍗曪紝鍙渶瑕侀氳繃javac -processor annotation.pap.AssignmentProcess Demo1.java榪欐牱鐨勬柟寮忓嵆鍙?/p>
涓婇潰浠嬬粛鐨勮繖涓ょ鍋氭硶閮芥槸鍦ㄧ紪璇戞椂鍒昏繘琛屽鐞嗙殑銆傝屾湁浜涙椂鍊欏垯闇瑕佸湪榪愯鏃跺埢鏉ュ畬鎴愬娉ㄨВ鐨勫鐞嗐傝繖涓椂鍊欏氨闇瑕佺敤鍒癑ava鐨勫弽灝凙PI銆傚弽灝凙PI鎻愪緵浜?jiǎn)鍦q愯鏃跺埢璇誨彇娉ㄨВ淇℃伅鐨勬敮鎸併備笉榪囧墠鎻愭槸娉ㄨВ鐨勪繚鐣欑瓥鐣ュ0鏄庣殑鏄繍琛屾椂銆侸ava鍙嶅皠API鐨?a style="text-decoration: none; color: #286ab2; outline: none !important; margin: 0px; border: 0px; padding: 0px;">AnnotatedElement鎺ュ彛鎻愪緵浜?jiǎn)鑾峰彇绫汇佹柟娉曞拰鍩熶笂鐨勬敞瑙g殑瀹炵敤鏂規(guī)硶銆傛瘮濡傝幏鍙栧埌涓涓狢lass綾誨璞′箣鍚庯紝閫氳繃getAnnotation鏂規(guī)硶灝卞彲浠ヨ幏鍙栧埌璇ョ被涓婃坊鍔犵殑鎸囧畾娉ㄨВ綾誨瀷鐨勬敞瑙c?/p>
涓嬮潰閫氳繃涓涓叿浣撶殑瀹炰緥鏉ュ垎鏋愯鏄庡湪瀹炶返涓浣曟潵浣跨敤鍜屽鐞嗘敞瑙c傚亣瀹氭湁涓涓叕鍙哥殑闆囧憳淇℃伅緋葷粺錛屼粠璁塊棶鎺у埗鐨勮搴﹀嚭鍙戯紝瀵歸泧鍛樼殑宸ヨ祫鐨勬洿鏂板彧鑳界敱鍏鋒湁鐗瑰畾瑙掕壊鐨勭敤鎴鋒墠鑳藉畬鎴愩傝冭檻鍒拌闂帶鍒墮渶姹傜殑鏅亶鎬э紝鍙互瀹氫箟涓涓敞瑙f潵璁╁紑鍙戜漢鍛樻柟渚跨殑鍦ㄤ唬鐮佷腑澹版槑璁塊棶鎺у埗鏉冮檺銆?br />
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface RequiredRoles
{ String[] value(); }
涓嬩竴姝ュ垯鏄浣曞娉ㄨВ榪涜澶勭悊錛岃繖閲屼嬌鐢ㄧ殑Java鐨勫弽灝凙PI騫剁粨鍚?a style="text-decoration: none; color: #286ab2; outline: none !important; margin: 0px; border: 0px; padding: 0px;">鍔ㄦ佷唬鐞?/a>銆備笅闈㈡槸鍔ㄦ佷唬鐞嗕腑鐨処nvocationHandler鎺ュ彛鐨勫疄鐜般?br />
public class AccessInvocationHandler<T> implements InvocationHandler { final T accessObj; public AccessInvocationHandler(T accessObj) { this.accessObj = accessObj; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { RequiredRoles annotation = method.getAnnotation(RequiredRoles.class); //閫氳繃鍙嶅皠API鑾峰彇娉ㄨВ if (annotation != null) { String[] roles = annotation.value(); String role = AccessControl.getCurrentRole(); if (!Arrays.asList(roles).contains(role)) { throw new AccessControlException("The user is not allowed to invoke this method."); } } return method.invoke(accessObj, args); } }
鍦ㄥ叿浣撲嬌鐢ㄧ殑鏃跺欙紝棣栧厛瑕侀氳繃Proxy.newProxyInstance鏂規(guī)硶鍒涘緩涓涓狤mployeeGateway鐨勬帴鍙g殑浠g悊綾伙紝浣跨敤璇ヤ唬鐞嗙被鏉ュ畬鎴愬疄闄呯殑鎿嶄綔銆?/p>