<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>反射 on 首页 | Widegram</title>
    <link>https://widegram.com/categories/%E5%8F%8D%E5%B0%84/</link>
    <description>Recent content in 反射 on 首页 | Widegram</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <lastBuildDate>Thu, 13 Jan 2022 21:08:00 +0000</lastBuildDate><atom:link href="https://widegram.com/categories/%E5%8F%8D%E5%B0%84/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Java 注解和反射的示例代码</title>
      <link>https://widegram.com/2022/01/java-annotation-and-reflection/</link>
      <pubDate>Thu, 13 Jan 2022 21:08:00 +0000</pubDate>
      
      <guid>https://widegram.com/2022/01/java-annotation-and-reflection/</guid>
      <description>一、注解 1. 初识注解 package com.onlineframework; import java.util.ArrayList; import java.util.List; @SuppressWarnings(&amp;#34;all&amp;#34;) public class annoTest { @Override public String toString() { return super.toString(); } @Deprecated public static void dep(){ System.out.println(&amp;#34;dep&amp;#34;); } public static void test02(){ List list = new ArrayList(); } public static void main(String[] args) { dep(); test02(); } } 2. 元注解 package com.onlineframework; import java.lang.annotation.*; @MyAnnotation public class AnnoTest02 { @MyAnnotation public void test(){ } } @Retention(RetentionPolicy.SOURCE) @Target({ElementType.METHOD,ElementType.TYPE}) @Documented @Inherited @interface MyAnnotation{ //@interface自动继承了java.</description>
      <content:encoded><![CDATA[<h2 id="一注解">一、注解</h2>
<h3 id="1-初识注解">1. 初识注解</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#f92672">package</span> com.onlineframework;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> java.util.ArrayList;
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> java.util.List;
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">@SuppressWarnings</span>(<span style="color:#e6db74">&#34;all&#34;</span>)
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">public</span> <span style="color:#66d9ef">class</span> <span style="color:#a6e22e">annoTest</span> {
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">@Override</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">public</span> String <span style="color:#a6e22e">toString</span>() {
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> <span style="color:#66d9ef">super</span>.<span style="color:#a6e22e">toString</span>();
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">@Deprecated</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">public</span> <span style="color:#66d9ef">static</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">dep</span>(){
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(<span style="color:#e6db74">&#34;dep&#34;</span>);
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">public</span> <span style="color:#66d9ef">static</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">test02</span>(){
</span></span><span style="display:flex;"><span>        List list <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> ArrayList();
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">public</span> <span style="color:#66d9ef">static</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">main</span>(String<span style="color:#f92672">[]</span> args) {
</span></span><span style="display:flex;"><span>        dep();
</span></span><span style="display:flex;"><span>        test02();
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><h3 id="2-元注解">2. 元注解</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#f92672">package</span> com.onlineframework;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> java.lang.annotation.*;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">@MyAnnotation</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">public</span> <span style="color:#66d9ef">class</span> <span style="color:#a6e22e">AnnoTest02</span> {
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">@MyAnnotation</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">public</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">test</span>(){
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">@Retention</span>(RetentionPolicy.<span style="color:#a6e22e">SOURCE</span>)
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">@Target</span>({ElementType.<span style="color:#a6e22e">METHOD</span>,ElementType.<span style="color:#a6e22e">TYPE</span>})
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">@Documented</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">@Inherited</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">@interface</span> MyAnnotation{    <span style="color:#75715e">//@interface自动继承了java.lang.annotation.Annotation接口</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><h3 id="3-自定义注解设置其默认值">3. 自定义注解，设置其默认值</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#f92672">package</span> com.onlineframework;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> java.lang.annotation.ElementType;
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> java.lang.annotation.Retention;
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> java.lang.annotation.RetentionPolicy;
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> java.lang.annotation.Target;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">public</span> <span style="color:#66d9ef">class</span> <span style="color:#a6e22e">AnnoTest03</span> {
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">@MyAnnotation2</span>()
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">@MyAnnotation3</span>(<span style="color:#e6db74">&#34;OK&#34;</span>)
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">public</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">test</span>(){
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">@Target</span>({ElementType.<span style="color:#a6e22e">TYPE</span>,ElementType.<span style="color:#a6e22e">METHOD</span>})
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">@Retention</span>(RetentionPolicy.<span style="color:#a6e22e">RUNTIME</span>)
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">@interface</span> MyAnnotation2 {
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">//定义参数：参数类型 + 参数名</span>
</span></span><span style="display:flex;"><span>    String <span style="color:#a6e22e">name</span>() <span style="color:#66d9ef">default</span> <span style="color:#e6db74">&#34;&#34;</span>;
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">age</span>() <span style="color:#66d9ef">default</span> 0;
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">id</span>() <span style="color:#66d9ef">default</span> <span style="color:#f92672">-</span>1;
</span></span><span style="display:flex;"><span>    String<span style="color:#f92672">[]</span> <span style="color:#a6e22e">schools</span>() <span style="color:#66d9ef">default</span> {};
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">@Target</span>(ElementType.<span style="color:#a6e22e">METHOD</span>)
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">@Retention</span>(RetentionPolicy.<span style="color:#a6e22e">RUNTIME</span>)
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">@interface</span> MyAnnotation3{
</span></span><span style="display:flex;"><span>    String<span style="color:#f92672">[]</span> <span style="color:#a6e22e">value</span>();
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><h2 id="二反射">二、反射</h2>
<h3 id="1-什么是反射">1. 什么是反射</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#f92672">package</span> com.onlineframework;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">//什么是反射</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">public</span> <span style="color:#66d9ef">class</span> <span style="color:#a6e22e">ReflectionTest01</span> {
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">public</span> <span style="color:#66d9ef">static</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">main</span>(String<span style="color:#f92672">[]</span> args) <span style="color:#66d9ef">throws</span> ClassNotFoundException {
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">//一个类被加载后，类的整个结构都会被封装在Class对象中</span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">//三种获得Class对象的方法</span>
</span></span><span style="display:flex;"><span>        Class c1 <span style="color:#f92672">=</span> Class.<span style="color:#a6e22e">forName</span>(<span style="color:#e6db74">&#34;com.onlineframework.User&#34;</span>);
</span></span><span style="display:flex;"><span>        Class c2 <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> User().<span style="color:#a6e22e">getClass</span>();
</span></span><span style="display:flex;"><span>        Class c3 <span style="color:#f92672">=</span> User.<span style="color:#a6e22e">class</span>;
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(c1.<span style="color:#a6e22e">hashCode</span>() <span style="color:#f92672">==</span> c2.<span style="color:#a6e22e">hashCode</span>() <span style="color:#f92672">&amp;&amp;</span> c2.<span style="color:#a6e22e">hashCode</span>() <span style="color:#f92672">==</span> c3.<span style="color:#a6e22e">hashCode</span>()); <span style="color:#75715e">//一个类在内存中只有一个Class对象</span>
</span></span><span style="display:flex;"><span>        
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">class</span> <span style="color:#a6e22e">User</span>{
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">private</span> String name;
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">private</span> <span style="color:#66d9ef">int</span> id;
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">private</span> <span style="color:#66d9ef">int</span> age;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">@Override</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">public</span> String <span style="color:#a6e22e">toString</span>() {
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> <span style="color:#e6db74">&#34;User{&#34;</span> <span style="color:#f92672">+</span>
</span></span><span style="display:flex;"><span>                <span style="color:#e6db74">&#34;name=&#39;&#34;</span> <span style="color:#f92672">+</span> name <span style="color:#f92672">+</span> <span style="color:#e6db74">&#39;\&#39;&#39;</span> <span style="color:#f92672">+</span>
</span></span><span style="display:flex;"><span>                <span style="color:#e6db74">&#34;, id=&#34;</span> <span style="color:#f92672">+</span> id <span style="color:#f92672">+</span>
</span></span><span style="display:flex;"><span>                <span style="color:#e6db74">&#34;, age=&#34;</span> <span style="color:#f92672">+</span> age <span style="color:#f92672">+</span>
</span></span><span style="display:flex;"><span>                <span style="color:#e6db74">&#39;}&#39;</span>;
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">public</span> <span style="color:#a6e22e">User</span>(){}
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">public</span> <span style="color:#a6e22e">User</span>(String name, <span style="color:#66d9ef">int</span> id, <span style="color:#66d9ef">int</span> age) {
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">name</span> <span style="color:#f92672">=</span> name;
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">id</span> <span style="color:#f92672">=</span> id;
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">age</span> <span style="color:#f92672">=</span> age;
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">public</span> String <span style="color:#a6e22e">getName</span>() {
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> name;
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">public</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">setName</span>(String name) {
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">name</span> <span style="color:#f92672">=</span> name;
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">public</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">getId</span>() {
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> id;
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">public</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">setId</span>(<span style="color:#66d9ef">int</span> id) {
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">id</span> <span style="color:#f92672">=</span> id;
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">public</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">getAge</span>() {
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> age;
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">public</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">setAge</span>(<span style="color:#66d9ef">int</span> age) {
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">age</span> <span style="color:#f92672">=</span> age;
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><h3 id="2-获得父类对象">2. 获得父类对象</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#f92672">package</span> com.onlineframework;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">public</span> <span style="color:#66d9ef">class</span> <span style="color:#a6e22e">ReflectionTest02</span> {
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">public</span> <span style="color:#66d9ef">static</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">main</span>(String<span style="color:#f92672">[]</span> args) <span style="color:#66d9ef">throws</span> ClassNotFoundException {
</span></span><span style="display:flex;"><span>        Person p <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> Student();
</span></span><span style="display:flex;"><span>        Class c1 <span style="color:#f92672">=</span> p.<span style="color:#a6e22e">getClass</span>();
</span></span><span style="display:flex;"><span>        Class c2 <span style="color:#f92672">=</span> Class.<span style="color:#a6e22e">forName</span>(<span style="color:#e6db74">&#34;com.onlineframework.Person&#34;</span>);
</span></span><span style="display:flex;"><span>        Class c3 <span style="color:#f92672">=</span> Person.<span style="color:#a6e22e">class</span>;
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(c1.<span style="color:#a6e22e">hashCode</span>());
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(c2.<span style="color:#a6e22e">hashCode</span>());
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(c3.<span style="color:#a6e22e">hashCode</span>());
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">//内置包装类都有一个TYPE属性</span>
</span></span><span style="display:flex;"><span>        Class<span style="color:#f92672">&lt;</span>Integer<span style="color:#f92672">&gt;</span> c4 <span style="color:#f92672">=</span> Integer.<span style="color:#a6e22e">TYPE</span>;
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(c4);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">//获得父类对象</span>
</span></span><span style="display:flex;"><span>        Class c5 <span style="color:#f92672">=</span> c1.<span style="color:#a6e22e">getSuperclass</span>();
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(c5);
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">class</span> <span style="color:#a6e22e">Person</span>{
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">public</span> String name;
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">public</span> <span style="color:#66d9ef">int</span> age;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">class</span> <span style="color:#a6e22e">Student</span> <span style="color:#66d9ef">extends</span> Person{
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">public</span> <span style="color:#a6e22e">Student</span>(){
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">name</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;stu&#34;</span>;
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">class</span> <span style="color:#a6e22e">Teacher</span> <span style="color:#66d9ef">extends</span> Person{
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">public</span> <span style="color:#a6e22e">Teacher</span>(){
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">name</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;teach&#34;</span>;
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><h3 id="3-各种类型的class对象">3. 各种类型的Class对象</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#f92672">package</span> com.onlineframework;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> java.lang.annotation.ElementType;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">public</span> <span style="color:#66d9ef">class</span> <span style="color:#a6e22e">ReflectionTest04</span> {
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">public</span> <span style="color:#66d9ef">static</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">main</span>(String<span style="color:#f92672">[]</span> args) {
</span></span><span style="display:flex;"><span>        Class objectClass <span style="color:#f92672">=</span> Object.<span style="color:#a6e22e">class</span>;   <span style="color:#75715e">//类</span>
</span></span><span style="display:flex;"><span>        Class comparableClass <span style="color:#f92672">=</span> Comparable.<span style="color:#a6e22e">class</span>; <span style="color:#75715e">//接口</span>
</span></span><span style="display:flex;"><span>        Class strArrayClass <span style="color:#f92672">=</span> String<span style="color:#f92672">[]</span>.<span style="color:#a6e22e">class</span>;<span style="color:#75715e">//一维数组</span>
</span></span><span style="display:flex;"><span>        Class intArrayClass <span style="color:#f92672">=</span> <span style="color:#66d9ef">int</span><span style="color:#f92672">[][]</span>.<span style="color:#a6e22e">class</span>;<span style="color:#75715e">//二维数组</span>
</span></span><span style="display:flex;"><span>        Class overrideClass <span style="color:#f92672">=</span> Override.<span style="color:#a6e22e">class</span>;<span style="color:#75715e">//注解</span>
</span></span><span style="display:flex;"><span>        Class elementTypeClass <span style="color:#f92672">=</span> ElementType.<span style="color:#a6e22e">class</span>; <span style="color:#75715e">//枚举</span>
</span></span><span style="display:flex;"><span>        Class integerClass <span style="color:#f92672">=</span> Integer.<span style="color:#a6e22e">class</span>;<span style="color:#75715e">//基本数据类型</span>
</span></span><span style="display:flex;"><span>        Class voidClass <span style="color:#f92672">=</span> <span style="color:#66d9ef">void</span>.<span style="color:#a6e22e">class</span>;<span style="color:#75715e">//void</span>
</span></span><span style="display:flex;"><span>        Class classClass <span style="color:#f92672">=</span> Class.<span style="color:#a6e22e">class</span>;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(objectClass);
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(comparableClass);
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(strArrayClass);
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(intArrayClass);
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(overrideClass);
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(elementTypeClass);
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(integerClass);
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(voidClass);
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(classClass);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">int</span> <span style="color:#f92672">[]</span> a <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> <span style="color:#66d9ef">int</span><span style="color:#f92672">[</span>10<span style="color:#f92672">]</span>;
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">int</span> <span style="color:#f92672">[]</span> b <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> <span style="color:#66d9ef">int</span><span style="color:#f92672">[</span>20<span style="color:#f92672">]</span>;
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(a.<span style="color:#a6e22e">getClass</span>().<span style="color:#a6e22e">hashCode</span>());    <span style="color:#75715e">//只要类型与维度一样，就是同一个Class</span>
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(b.<span style="color:#a6e22e">getClass</span>().<span style="color:#a6e22e">hashCode</span>());
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(a.<span style="color:#a6e22e">getClass</span>().<span style="color:#a6e22e">hashCode</span>() <span style="color:#f92672">==</span> b.<span style="color:#a6e22e">getClass</span>().<span style="color:#a6e22e">hashCode</span>()); <span style="color:#75715e">//true</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><h3 id="4-类加载的过程class对象加载的时机">4. 类加载的过程、Class对象加载的时机</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#f92672">package</span> com.onlineframework;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">public</span> <span style="color:#66d9ef">class</span> <span style="color:#a6e22e">ReflectionTest05</span> {
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">public</span> <span style="color:#66d9ef">static</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">main</span>(String<span style="color:#f92672">[]</span> args) {
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(<span style="color:#e6db74">&#34;new之前&#34;</span>);
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(A.<span style="color:#a6e22e">m</span>);
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(<span style="color:#e6db74">&#34;new之前&#34;</span>);
</span></span><span style="display:flex;"><span>        A a <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> A();
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(A.<span style="color:#a6e22e">m</span>);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">/*
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">        * 1. 加载，会产生一个类对应的Class对象
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">        * 2. 链接，链接结束后 m = 0
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">        * 3. 初始化，
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">        *     &lt;clinit&gt;(){
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">        *       m=300;
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">        *       System.out.println(&#34;静态代码块&#34;);
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">        *       m=100;
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">        *     }
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">        *   此时 m = 100
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">        * */</span>
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">class</span> <span style="color:#a6e22e">A</span>{
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">static</span> {
</span></span><span style="display:flex;"><span>        m<span style="color:#f92672">=</span>300;
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(<span style="color:#e6db74">&#34;静态代码块&#34;</span>);
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">static</span> <span style="color:#66d9ef">int</span> m <span style="color:#f92672">=</span> 100;
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">public</span> <span style="color:#a6e22e">A</span>(){
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(<span style="color:#e6db74">&#34;无参构造&#34;</span>);
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><h3 id="5-类初始化的时机">5. 类初始化的时机</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#f92672">package</span> com.onlineframework;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">//类什么时候初始化？</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">public</span> <span style="color:#66d9ef">class</span> <span style="color:#a6e22e">ReflectionTest06</span> {
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">static</span> {
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(<span style="color:#e6db74">&#34;Main init&#34;</span>);
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">public</span> <span style="color:#66d9ef">static</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">main</span>(String<span style="color:#f92672">[]</span> args) <span style="color:#66d9ef">throws</span> ClassNotFoundException {
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">//Son son = new Son();</span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">/*
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">          Main init
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">          Father init
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">          Son init
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">        */</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">//Class.forName(&#34;com.onlineframework.Son&#34;);</span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">/*
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">          Main init
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">          Father init
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">          Son init
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">        */</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">//System.out.println(Son.b); //Son类不会加载</span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">/*
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">          Main init
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">          Father init
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">          2
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">        */</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">//Son[] array = new Son[5];   //不会引起任何初始化</span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">/*Main init*/</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(Son.<span style="color:#a6e22e">M</span>);      <span style="color:#75715e">//常量在链接阶段就被赋值，不引起任何初始化</span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">/*Main init*/</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">class</span> <span style="color:#a6e22e">Father</span> {
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">static</span> {
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(<span style="color:#e6db74">&#34;Father init&#34;</span>);
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">static</span> <span style="color:#66d9ef">int</span> b <span style="color:#f92672">=</span> 2;
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">class</span> <span style="color:#a6e22e">Son</span> <span style="color:#66d9ef">extends</span> Father{
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">static</span> {
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(<span style="color:#e6db74">&#34;Son init&#34;</span>);
</span></span><span style="display:flex;"><span>        m <span style="color:#f92672">=</span> 300;
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">static</span> <span style="color:#66d9ef">int</span> m <span style="color:#f92672">=</span> 100;
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">static</span> <span style="color:#66d9ef">final</span> <span style="color:#66d9ef">int</span> M <span style="color:#f92672">=</span> 1;
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><h3 id="6-三种classloader">6. 三种ClassLoader</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#f92672">package</span> com.onlineframework;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">public</span> <span style="color:#66d9ef">class</span> <span style="color:#a6e22e">ReflectionTest07</span> {
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">public</span> <span style="color:#66d9ef">static</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">main</span>(String<span style="color:#f92672">[]</span> args) <span style="color:#66d9ef">throws</span> ClassNotFoundException {
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">//获取系统类的加载器</span>
</span></span><span style="display:flex;"><span>        ClassLoader systemClassLoader <span style="color:#f92672">=</span> ClassLoader.<span style="color:#a6e22e">getSystemClassLoader</span>();
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(systemClassLoader);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">//系统类加载器的父类加载器  --&gt; 扩展类加载器</span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">//负责jre/lib/ext目录下的jar包加载，或者 -D java.ext.dirs 指定目录下的jar包加载器</span>
</span></span><span style="display:flex;"><span>        ClassLoader parent <span style="color:#f92672">=</span> systemClassLoader.<span style="color:#a6e22e">getParent</span>();
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(parent);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">//扩展类加载器的父类加载器 --&gt; 根加载器（C/C++），无法直接获取</span>
</span></span><span style="display:flex;"><span>        ClassLoader parent1 <span style="color:#f92672">=</span> parent.<span style="color:#a6e22e">getParent</span>();
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(parent1);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">//sun.misc.Launcher$AppClassLoader@18b4aac2</span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">//sun.misc.Launcher$ExtClassLoader@1b6d3586</span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">//null</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        ClassLoader classLoader <span style="color:#f92672">=</span> Class.<span style="color:#a6e22e">forName</span>(<span style="color:#e6db74">&#34;com.onlineframework.ReflectionTest07&#34;</span>).<span style="color:#a6e22e">getClassLoader</span>();
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(classLoader);    <span style="color:#75715e">//sun.misc.Launcher$AppClassLoader@18b4aac2</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        ClassLoader classLoader1 <span style="color:#f92672">=</span> Class.<span style="color:#a6e22e">forName</span>(<span style="color:#e6db74">&#34;java.lang.Object&#34;</span>).<span style="color:#a6e22e">getClassLoader</span>();
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(classLoader1);   <span style="color:#75715e">//跟加载器：null</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(System.<span style="color:#a6e22e">getProperty</span>(<span style="color:#e6db74">&#34;java.class.path&#34;</span>));
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">/* C:\Program Files\Java\jdk1.8.0_271\jre\lib\charsets.jar;
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">        C:\Program Files\Java\jdk1.8.0_271\jre\lib\deploy.jar;
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">        C:\Program Files\Java\jdk1.8.0_271\jre\lib\ext\access-bridge-64.jar;
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">        C:\Program Files\Java\jdk1.8.0_271\jre\lib\ext\cldrdata.jar;
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">        C:\Program Files\Java\jdk1.8.0_271\jre\lib\ext\dnsns.jar;
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">        C:\Program Files\Java\jdk1.8.0_271\jre\lib\ext\jaccess.jar;
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">        C:\Program Files\Java\jdk1.8.0_271\jre\lib\ext\jfxrt.jar;
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">        C:\Program Files\Java\jdk1.8.0_271\jre\lib\ext\localedata.jar;
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">        C:\Program Files\Java\jdk1.8.0_271\jre\lib\ext\nashorn.jar;
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">        C:\Program Files\Java\jdk1.8.0_271\jre\lib\ext\sunec.jar;
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">        C:\Program Files\Java\jdk1.8.0_271\jre\lib\ext\sunjce_provider.jar;
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">        C:\Program Files\Java\jdk1.8.0_271\jre\lib\ext\sunmscapi.jar;
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">        C:\Program Files\Java\jdk1.8.0_271\jre\lib\ext\sunpkcs11.jar;
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">        C:\Program Files\Java\jdk1.8.0_271\jre\lib\ext\zipfs.jar;
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">        C:\Program Files\Java\jdk1.8.0_271\jre\lib\javaws.jar;
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">        C:\Program Files\Java\jdk1.8.0_271\jre\lib\jce.jar;
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">        C:\Program Files\Java\jdk1.8.0_271\jre\lib\jfr.jar;
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">        C:\Program Files\Java\jdk1.8.0_271\jre\lib\jfxswt.jar;
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">        C:\Program Files\Java\jdk1.8.0_271\jre\lib\jsse.jar;
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">        C:\Program Files\Java\jdk1.8.0_271\jre\lib\management-agent.jar;
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">        C:\Program Files\Java\jdk1.8.0_271\jre\lib\plugin.jar;
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">        C:\Program Files\Java\jdk1.8.0_271\jre\lib\resources.jar;
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">        C:\Program Files\Java\jdk1.8.0_271\jre\lib\rt.jar;
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">        C:\Users\perfxlab_000\IdeaProjects\jbasic\target\classes;
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">        F:\Program Files\JetBrains\IntelliJ IDEA 2021.3.1\lib\idea_rt.jar
</span></span></span><span style="display:flex;"><span><span style="color:#75715e">       */</span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">//双亲委派机制：自定义的类例如 java.lang.String 无法替代根加载器加载的类，提高安全性</span>
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><h3 id="7-获得类的信息">7. 获得类的信息</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#f92672">package</span> com.onlineframework;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> java.lang.reflect.Constructor;
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> java.lang.reflect.Field;
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> java.lang.reflect.Method;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">//获得类的信息</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">public</span> <span style="color:#66d9ef">class</span> <span style="color:#a6e22e">ReflectionTest08</span> {
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">public</span> <span style="color:#66d9ef">static</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">main</span>(String<span style="color:#f92672">[]</span> args) <span style="color:#66d9ef">throws</span> ClassNotFoundException, NoSuchFieldException, NoSuchMethodException {
</span></span><span style="display:flex;"><span>        Class c1 <span style="color:#f92672">=</span> Class.<span style="color:#a6e22e">forName</span>(<span style="color:#e6db74">&#34;com.onlineframework.User&#34;</span>);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(c1.<span style="color:#a6e22e">getName</span>());       <span style="color:#75715e">//获得包名+类名  com.onlineframework.User</span>
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(c1.<span style="color:#a6e22e">getSimpleName</span>()); <span style="color:#75715e">//获得类名      User</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(<span style="color:#e6db74">&#34;======================================================&#34;</span>);
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">for</span> (Field field : c1.<span style="color:#a6e22e">getFields</span>()) {    <span style="color:#75715e">//只能找到public属性</span>
</span></span><span style="display:flex;"><span>            System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(field);
</span></span><span style="display:flex;"><span>        }
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">//Field name = c1.getField(&#34;name&#34;);  // 获取不到</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(<span style="color:#e6db74">&#34;==============getDeclaredFields============================&#34;</span>);
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">for</span> (Field declaredField : c1.<span style="color:#a6e22e">getDeclaredFields</span>()) {    <span style="color:#75715e">//获得所有属性</span>
</span></span><span style="display:flex;"><span>            System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(declaredField);
</span></span><span style="display:flex;"><span>        }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        Field name1 <span style="color:#f92672">=</span> c1.<span style="color:#a6e22e">getDeclaredField</span>(<span style="color:#e6db74">&#34;name&#34;</span>);
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(name1);
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(<span style="color:#e6db74">&#34;==============getMethods=======================&#34;</span>);
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">for</span> (Method method : c1.<span style="color:#a6e22e">getMethods</span>()) { <span style="color:#75715e">//获得所有public方法（包括父类），不包括所有private</span>
</span></span><span style="display:flex;"><span>            System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(method);
</span></span><span style="display:flex;"><span>        }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(<span style="color:#e6db74">&#34;==============getDeclaredMethods=======================&#34;</span>);
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">for</span> (Method declaredMethod : c1.<span style="color:#a6e22e">getDeclaredMethods</span>()) { <span style="color:#75715e">//只获得该类内方法，包括private</span>
</span></span><span style="display:flex;"><span>            System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(declaredMethod);
</span></span><span style="display:flex;"><span>        }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(<span style="color:#e6db74">&#34;==============getMethod=======================&#34;</span>);
</span></span><span style="display:flex;"><span>        Method getName <span style="color:#f92672">=</span> c1.<span style="color:#a6e22e">getMethod</span>(<span style="color:#e6db74">&#34;getName&#34;</span>, <span style="color:#66d9ef">null</span>);
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(getName);
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(c1.<span style="color:#a6e22e">getMethod</span>(<span style="color:#e6db74">&#34;setName&#34;</span>, String.<span style="color:#a6e22e">class</span>));
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(<span style="color:#e6db74">&#34;==============getConstructors (public only)=======================&#34;</span>);
</span></span><span style="display:flex;"><span>        Constructor<span style="color:#f92672">[]</span> constructors <span style="color:#f92672">=</span> c1.<span style="color:#a6e22e">getConstructors</span>();
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">for</span> (Constructor constructor : constructors) {
</span></span><span style="display:flex;"><span>            System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(constructor);
</span></span><span style="display:flex;"><span>        }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(<span style="color:#e6db74">&#34;==============getDeclaredConstructors (all)=======================&#34;</span>);
</span></span><span style="display:flex;"><span>        Constructor<span style="color:#f92672">[]</span> declaredConstructors <span style="color:#f92672">=</span> c1.<span style="color:#a6e22e">getDeclaredConstructors</span>();
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">for</span> (Constructor declaredConstructor : declaredConstructors) {
</span></span><span style="display:flex;"><span>            System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(declaredConstructor);
</span></span><span style="display:flex;"><span>        }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(<span style="color:#e6db74">&#34;==============getDeclaredConstructor=======================&#34;</span>);
</span></span><span style="display:flex;"><span>        Constructor declaredConstructor <span style="color:#f92672">=</span> c1.<span style="color:#a6e22e">getDeclaredConstructor</span>(String.<span style="color:#a6e22e">class</span>, Integer.<span style="color:#a6e22e">TYPE</span>, Integer.<span style="color:#a6e22e">TYPE</span>);
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(declaredConstructor);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><h3 id="8-通过反射动态创建对象">8. 通过反射动态创建对象</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#f92672">package</span> com.onlineframework;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> java.lang.reflect.Constructor;
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> java.lang.reflect.Field;
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> java.lang.reflect.InvocationTargetException;
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> java.lang.reflect.Method;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">//通过反射动态创建对象</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">public</span> <span style="color:#66d9ef">class</span> <span style="color:#a6e22e">ReflectionTest09</span> {
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">public</span> <span style="color:#66d9ef">static</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">main</span>(String<span style="color:#f92672">[]</span> args) <span style="color:#66d9ef">throws</span> ClassNotFoundException, InstantiationException, IllegalAccessException, NoSuchMethodException, InvocationTargetException, NoSuchFieldException {
</span></span><span style="display:flex;"><span>        Class c1 <span style="color:#f92672">=</span> Class.<span style="color:#a6e22e">forName</span>(<span style="color:#e6db74">&#34;com.onlineframework.User&#34;</span>);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        User newInstance <span style="color:#f92672">=</span> (User)c1.<span style="color:#a6e22e">newInstance</span>();  <span style="color:#75715e">//无参构造器</span>
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(newInstance);        <span style="color:#75715e">// User{name=&#39;null&#39;, id=0, age=0}</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">//通过构造器创建对象</span>
</span></span><span style="display:flex;"><span>        Constructor declaredConstructor <span style="color:#f92672">=</span> c1.<span style="color:#a6e22e">getDeclaredConstructor</span>(String.<span style="color:#a6e22e">class</span>, <span style="color:#66d9ef">int</span>.<span style="color:#a6e22e">class</span>, <span style="color:#66d9ef">int</span>.<span style="color:#a6e22e">class</span>);
</span></span><span style="display:flex;"><span>        Object aaa <span style="color:#f92672">=</span> declaredConstructor.<span style="color:#a6e22e">newInstance</span>(<span style="color:#e6db74">&#34;aaa&#34;</span>, 11, 12);
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(aaa);        <span style="color:#75715e">// User{name=&#39;aaa&#39;, id=11, age=12}</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">//通过反射调用方法</span>
</span></span><span style="display:flex;"><span>        User user <span style="color:#f92672">=</span> (User) c1.<span style="color:#a6e22e">newInstance</span>();
</span></span><span style="display:flex;"><span>        Method setName <span style="color:#f92672">=</span> c1.<span style="color:#a6e22e">getMethod</span>(<span style="color:#e6db74">&#34;setName&#34;</span>, String.<span style="color:#a6e22e">class</span>);
</span></span><span style="display:flex;"><span>        setName.<span style="color:#a6e22e">invoke</span>(user,<span style="color:#e6db74">&#34;name1&#34;</span>);
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(user);       <span style="color:#75715e">// User{name=&#39;name1&#39;, id=0, age=0}</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">//通过反射操作属性(private异常)</span>
</span></span><span style="display:flex;"><span>        Field name <span style="color:#f92672">=</span> c1.<span style="color:#a6e22e">getDeclaredField</span>(<span style="color:#e6db74">&#34;name&#34;</span>);
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">//name.set(user,&#34;name2&#34;);</span>
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(user);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">//通过反射操作属性</span>
</span></span><span style="display:flex;"><span>        name.<span style="color:#a6e22e">setAccessible</span>(<span style="color:#66d9ef">true</span>);
</span></span><span style="display:flex;"><span>        name.<span style="color:#a6e22e">set</span>(user,<span style="color:#e6db74">&#34;name3&#34;</span>);
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(user);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><h3 id="9-反射的性能">9. 反射的性能</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#f92672">package</span> com.onlineframework;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> javax.jws.soap.SOAPBinding;
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> java.lang.reflect.InvocationTargetException;
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> java.lang.reflect.Method;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">//性能问题</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">public</span> <span style="color:#66d9ef">class</span> <span style="color:#a6e22e">ReflectionTest10</span> {
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">public</span> <span style="color:#66d9ef">static</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">test_ordinary</span>(){
</span></span><span style="display:flex;"><span>        User user <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> User();
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">long</span> startTime <span style="color:#f92672">=</span> System.<span style="color:#a6e22e">currentTimeMillis</span>();
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i<span style="color:#f92672">=</span>0;i<span style="color:#f92672">&lt;</span> 1000000000 ;i<span style="color:#f92672">++</span>){
</span></span><span style="display:flex;"><span>            user.<span style="color:#a6e22e">getName</span>();
</span></span><span style="display:flex;"><span>        }
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">long</span> endTime <span style="color:#f92672">=</span> System.<span style="color:#a6e22e">currentTimeMillis</span>();
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(<span style="color:#e6db74">&#34;普通方法：&#34;</span><span style="color:#f92672">+</span>(endTime <span style="color:#f92672">-</span> startTime) <span style="color:#f92672">+</span><span style="color:#e6db74">&#34;ms&#34;</span>);
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">public</span> <span style="color:#66d9ef">static</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">test_reflection</span>() <span style="color:#66d9ef">throws</span> NoSuchMethodException, InvocationTargetException, IllegalAccessException {
</span></span><span style="display:flex;"><span>        User user <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> User();
</span></span><span style="display:flex;"><span>        Class c1 <span style="color:#f92672">=</span> user.<span style="color:#a6e22e">getClass</span>();
</span></span><span style="display:flex;"><span>        Method getName <span style="color:#f92672">=</span> c1.<span style="color:#a6e22e">getMethod</span>(<span style="color:#e6db74">&#34;getName&#34;</span>);
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">long</span> startTime <span style="color:#f92672">=</span> System.<span style="color:#a6e22e">currentTimeMillis</span>();
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i<span style="color:#f92672">=</span>0;i<span style="color:#f92672">&lt;</span> 1000000000 ;i<span style="color:#f92672">++</span>){
</span></span><span style="display:flex;"><span>            getName.<span style="color:#a6e22e">invoke</span>(user);
</span></span><span style="display:flex;"><span>        }
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">long</span> endTime <span style="color:#f92672">=</span> System.<span style="color:#a6e22e">currentTimeMillis</span>();
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(<span style="color:#e6db74">&#34;反射方法：&#34;</span><span style="color:#f92672">+</span>(endTime <span style="color:#f92672">-</span> startTime) <span style="color:#f92672">+</span><span style="color:#e6db74">&#34;ms&#34;</span>);
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">public</span> <span style="color:#66d9ef">static</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">test_reflection_without_accessible</span>() <span style="color:#66d9ef">throws</span> NoSuchMethodException, InvocationTargetException, IllegalAccessException {
</span></span><span style="display:flex;"><span>        User user <span style="color:#f92672">=</span> <span style="color:#66d9ef">new</span> User();
</span></span><span style="display:flex;"><span>        Class c1 <span style="color:#f92672">=</span> user.<span style="color:#a6e22e">getClass</span>();
</span></span><span style="display:flex;"><span>        Method getName <span style="color:#f92672">=</span> c1.<span style="color:#a6e22e">getMethod</span>(<span style="color:#e6db74">&#34;getName&#34;</span>);
</span></span><span style="display:flex;"><span>        getName.<span style="color:#a6e22e">setAccessible</span>(<span style="color:#66d9ef">true</span>);
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">long</span> startTime <span style="color:#f92672">=</span> System.<span style="color:#a6e22e">currentTimeMillis</span>();
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">for</span> (<span style="color:#66d9ef">int</span> i<span style="color:#f92672">=</span>0;i<span style="color:#f92672">&lt;</span> 1000000000 ;i<span style="color:#f92672">++</span>){
</span></span><span style="display:flex;"><span>            getName.<span style="color:#a6e22e">invoke</span>(user);
</span></span><span style="display:flex;"><span>        }
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">long</span> endTime <span style="color:#f92672">=</span> System.<span style="color:#a6e22e">currentTimeMillis</span>();
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(<span style="color:#e6db74">&#34;反射方法关闭检测：&#34;</span><span style="color:#f92672">+</span>(endTime <span style="color:#f92672">-</span> startTime) <span style="color:#f92672">+</span><span style="color:#e6db74">&#34;ms&#34;</span>);
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">public</span> <span style="color:#66d9ef">static</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">main</span>(String<span style="color:#f92672">[]</span> args) <span style="color:#66d9ef">throws</span> InvocationTargetException, NoSuchMethodException, IllegalAccessException {
</span></span><span style="display:flex;"><span>        test_ordinary();
</span></span><span style="display:flex;"><span>        test_reflection();
</span></span><span style="display:flex;"><span>        test_reflection_without_accessible();
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">//普通方法：4ms</span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">//反射方法：2228ms</span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">//反射方法关闭检测：1485ms</span>
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><h3 id="10-反射获取泛型">10. 反射获取泛型</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#f92672">package</span> com.onlineframework;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> java.lang.reflect.Method;
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> java.lang.reflect.ParameterizedType;
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> java.lang.reflect.Type;
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> java.util.List;
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> java.util.Map;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">//反射获取泛型</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">public</span> <span style="color:#66d9ef">class</span> <span style="color:#a6e22e">ReflectionTest11</span> {
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">public</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">test1</span>(Map<span style="color:#f92672">&lt;</span>String,User<span style="color:#f92672">&gt;</span> map, List<span style="color:#f92672">&lt;</span>User<span style="color:#f92672">&gt;</span> list){
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(<span style="color:#e6db74">&#34;test1&#34;</span>);
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">public</span> Map<span style="color:#f92672">&lt;</span>String,User<span style="color:#f92672">&gt;</span> <span style="color:#a6e22e">test2</span>(){
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(<span style="color:#e6db74">&#34;test2&#34;</span>);
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> <span style="color:#66d9ef">null</span>;
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">public</span> <span style="color:#66d9ef">static</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">main</span>(String<span style="color:#f92672">[]</span> args) <span style="color:#66d9ef">throws</span> NoSuchMethodException {
</span></span><span style="display:flex;"><span>        Method method1 <span style="color:#f92672">=</span> ReflectionTest11.<span style="color:#a6e22e">class</span>.<span style="color:#a6e22e">getMethod</span>(<span style="color:#e6db74">&#34;test1&#34;</span>, Map.<span style="color:#a6e22e">class</span>, List.<span style="color:#a6e22e">class</span>);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">//获得参数的泛型类型</span>
</span></span><span style="display:flex;"><span>        Type<span style="color:#f92672">[]</span> genericParameterTypes1 <span style="color:#f92672">=</span> method1.<span style="color:#a6e22e">getGenericParameterTypes</span>();
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">for</span> (Type type : genericParameterTypes1) {
</span></span><span style="display:flex;"><span>            System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(type);
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">if</span>(type <span style="color:#66d9ef">instanceof</span> ParameterizedType){  <span style="color:#75715e">//ParameterizedType 参数化类型，例如Collection&lt;String&gt;</span>
</span></span><span style="display:flex;"><span>                Type<span style="color:#f92672">[]</span> actualTypeArguments <span style="color:#f92672">=</span> ((ParameterizedType) type).<span style="color:#a6e22e">getActualTypeArguments</span>();
</span></span><span style="display:flex;"><span>                <span style="color:#66d9ef">for</span> (Type actualTypeArgument : actualTypeArguments) {
</span></span><span style="display:flex;"><span>                    System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(<span style="color:#e6db74">&#34;  &#34;</span><span style="color:#f92672">+</span>actualTypeArgument);
</span></span><span style="display:flex;"><span>                }
</span></span><span style="display:flex;"><span>            }
</span></span><span style="display:flex;"><span>        }
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(<span style="color:#e6db74">&#34;======================test2================&#34;</span>);
</span></span><span style="display:flex;"><span>        Method test2 <span style="color:#f92672">=</span> ReflectionTest11.<span style="color:#a6e22e">class</span>.<span style="color:#a6e22e">getMethod</span>(<span style="color:#e6db74">&#34;test2&#34;</span>);
</span></span><span style="display:flex;"><span>        Type genericReturnType <span style="color:#f92672">=</span> test2.<span style="color:#a6e22e">getGenericReturnType</span>();
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span>(genericReturnType <span style="color:#66d9ef">instanceof</span> ParameterizedType){
</span></span><span style="display:flex;"><span>            Type<span style="color:#f92672">[]</span> actualTypeArguments <span style="color:#f92672">=</span> ((ParameterizedType) genericReturnType).<span style="color:#a6e22e">getActualTypeArguments</span>();
</span></span><span style="display:flex;"><span>            <span style="color:#66d9ef">for</span> (Type actualTypeArgument : actualTypeArguments) {
</span></span><span style="display:flex;"><span>                System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(actualTypeArgument);
</span></span><span style="display:flex;"><span>            }
</span></span><span style="display:flex;"><span>        }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><h3 id="11-注解与反射">11. 注解与反射</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-java" data-lang="java"><span style="display:flex;"><span><span style="color:#f92672">package</span> com.onlineframework;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">import</span> java.lang.annotation.*;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">public</span> <span style="color:#66d9ef">class</span> <span style="color:#a6e22e">ReflectionTest12</span> {
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">public</span> <span style="color:#66d9ef">static</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">main</span>(String<span style="color:#f92672">[]</span> args) <span style="color:#66d9ef">throws</span> ClassNotFoundException, NoSuchFieldException {
</span></span><span style="display:flex;"><span>        Class c1 <span style="color:#f92672">=</span> Class.<span style="color:#a6e22e">forName</span>(<span style="color:#e6db74">&#34;com.onlineframework.Student2&#34;</span>);
</span></span><span style="display:flex;"><span>        Annotation<span style="color:#f92672">[]</span> annotations <span style="color:#f92672">=</span> c1.<span style="color:#a6e22e">getAnnotations</span>();
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">for</span> (Annotation annotation : annotations) {
</span></span><span style="display:flex;"><span>            System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(annotation);     <span style="color:#75715e">//@com.onlineframework.Student2Table(value=db_student)</span>
</span></span><span style="display:flex;"><span>        }
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">//获得注解的value</span>
</span></span><span style="display:flex;"><span>        Student2Table c1Annotation <span style="color:#f92672">=</span> (Student2Table)c1.<span style="color:#a6e22e">getAnnotation</span>(Student2Table.<span style="color:#a6e22e">class</span>);
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(c1Annotation.<span style="color:#a6e22e">value</span>());<span style="color:#75715e">//db_student</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">//获得注解的其他属性</span>
</span></span><span style="display:flex;"><span>        Student2Field nameAnnotation <span style="color:#f92672">=</span> (Student2Field)c1.<span style="color:#a6e22e">getDeclaredField</span>(<span style="color:#e6db74">&#34;name&#34;</span>).<span style="color:#a6e22e">getAnnotation</span>(Student2Field.<span style="color:#a6e22e">class</span>);
</span></span><span style="display:flex;"><span>        System.<span style="color:#a6e22e">out</span>.<span style="color:#a6e22e">println</span>(nameAnnotation.<span style="color:#a6e22e">col</span>());<span style="color:#75715e">//db_name</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">@Student2Table</span>(<span style="color:#e6db74">&#34;db_student&#34;</span>)
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">class</span> <span style="color:#a6e22e">Student2</span> {
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">@Student2Field</span>(col <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;db_name&#34;</span>,type <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;char&#34;</span>,length <span style="color:#f92672">=</span> 10)
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">private</span> String name;
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">@Student2Field</span>(col <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;db_id&#34;</span>,type <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;int&#34;</span>,length <span style="color:#f92672">=</span> 10)
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">private</span> <span style="color:#66d9ef">int</span> id;
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">@Student2Field</span>(col <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;db_age&#34;</span>,type <span style="color:#f92672">=</span> <span style="color:#e6db74">&#34;int&#34;</span>,length <span style="color:#f92672">=</span> 10)
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">private</span> <span style="color:#66d9ef">int</span> age;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">public</span> <span style="color:#a6e22e">Student2</span>(){
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">public</span> <span style="color:#a6e22e">Student2</span>(String name, <span style="color:#66d9ef">int</span> id, <span style="color:#66d9ef">int</span> age) {
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">name</span> <span style="color:#f92672">=</span> name;
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">id</span> <span style="color:#f92672">=</span> id;
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">age</span> <span style="color:#f92672">=</span> age;
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#a6e22e">@Override</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">public</span> String <span style="color:#a6e22e">toString</span>() {
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> <span style="color:#e6db74">&#34;Student2{&#34;</span> <span style="color:#f92672">+</span>
</span></span><span style="display:flex;"><span>                <span style="color:#e6db74">&#34;name=&#39;&#34;</span> <span style="color:#f92672">+</span> name <span style="color:#f92672">+</span> <span style="color:#e6db74">&#39;\&#39;&#39;</span> <span style="color:#f92672">+</span>
</span></span><span style="display:flex;"><span>                <span style="color:#e6db74">&#34;, id=&#34;</span> <span style="color:#f92672">+</span> id <span style="color:#f92672">+</span>
</span></span><span style="display:flex;"><span>                <span style="color:#e6db74">&#34;, age=&#34;</span> <span style="color:#f92672">+</span> age <span style="color:#f92672">+</span>
</span></span><span style="display:flex;"><span>                <span style="color:#e6db74">&#39;}&#39;</span>;
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">public</span> String <span style="color:#a6e22e">getName</span>() {
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> name;
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">public</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">setName</span>(String name) {
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">name</span> <span style="color:#f92672">=</span> name;
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">public</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">getId</span>() {
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> id;
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">public</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">setId</span>(<span style="color:#66d9ef">int</span> id) {
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">id</span> <span style="color:#f92672">=</span> id;
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">public</span> <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">getAge</span>() {
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> age;
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">public</span> <span style="color:#66d9ef">void</span> <span style="color:#a6e22e">setAge</span>(<span style="color:#66d9ef">int</span> age) {
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">this</span>.<span style="color:#a6e22e">age</span> <span style="color:#f92672">=</span> age;
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">@Retention</span>(RetentionPolicy.<span style="color:#a6e22e">RUNTIME</span>)
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">@Target</span>(ElementType.<span style="color:#a6e22e">TYPE</span>)
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">@interface</span> Student2Table{
</span></span><span style="display:flex;"><span>    String <span style="color:#a6e22e">value</span>();
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">@Retention</span>(RetentionPolicy.<span style="color:#a6e22e">RUNTIME</span>)
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">@Target</span>(ElementType.<span style="color:#a6e22e">FIELD</span>)
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">@interface</span> Student2Field{
</span></span><span style="display:flex;"><span>    String <span style="color:#a6e22e">col</span>();
</span></span><span style="display:flex;"><span>    String <span style="color:#a6e22e">type</span>();
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">int</span> <span style="color:#a6e22e">length</span>();
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div>]]></content:encoded>
    </item>
    
  </channel>
</rss>
