Java初学者笔记六:反射

Posted 挖洞的土拨鼠

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java初学者笔记六:反射相关的知识,希望对你有一定的参考价值。

Java反射基础



零、基础类代码

import java.io.*;
import java.lang.reflect.*;
class father{
    public String fName;
    father(String name) {
        this.fName = name;
    }
    public void show() throws Exception{
        Runtime.getRuntime().exec("touch 2.txt");
    }
}

class child extends father{
    public int cAge;
    child(int age,String name){
        super(name);
        this.cAge = age;
    }
    public void display() {
        System.out.println("I am Child!");
    }
}

一、根据对象和类获取类


方法一 -> getClass()

对运行时候的对象调用getClass获取其类对象

public class InvokeLearn{
    public static void main(String[] args) throws Exception{
        father f = new father("TOM");
        child c = new child(5,"JIM");
        String clsname = c.getClass().getName();//可以获取类,然后getName返回类名字符串
    System.out.println(clsname);
    }
}

方法二 -> class属性

对类本身调用class属性

public class InvokeLearn{
    public static void main(String[] args) throws Exception{
        //Runtime.getRuntime().exec("touch 1.txt");
        father f = new father("TOM");
        child c = new child(5,"JIM");
        String clsname = c.getClass().getName();
        Class<child> clsname1 = child.class;
        System.out.println(clsname1.getName());
    }
}

方法三 -> Class.forName()

使用Class.forName()方法

public class InvokeLearn{
    public static void main(String[] args) throws Exception{
        //Runtime.getRuntime().exec("touch 1.txt");
        father f = new father("TOM");
        child c = new child(5,"JIM");
        Class cls = Class.forName("father");
    }
}

二、根据类获取构造方法并创建实例


  • 常用的几个方法:
    • getDeclaredConstructor()
    • getDeclaredConstructors()
    • getConstructors()
    • getConstructor()
public class InvokeLearn{
    public static void main(String[] args) throws Exception{
    Class cls = Class.forName("father");
    Constructor[] conArray= cls.getDeclaredConstructors();//所有构造方法
    /*
    * getConstructors() ->所有公有的构造方法
    * getConstructors(null) -> 所有公有的无餐的构造方法
    * getDeclaredConstructor(parameters_type) -> 私有的含参的构造方法,parameters_types是参数的类型
    */
    //System.out.print(conArray.length);
    Constructor newc = conArray[0];
    Object obj = newc.newInstance("Tom");//调用构造方法创建实例
    }
}

三、根据类获取成员变量并使用


  • 常用的几个方法:
    • getDeclaredField()
    • getDeclaredFileds()
    • getFields()
    • getField()
public class InvokeLearn{
    public static void main(String[] args) throws Exception{
        Class cls = Class.forName("father");
        Constructor[] conArray= cls.getDeclaredConstructors();//所有构造方法
        Constructor newc = conArray[0];
        Object obj = newc.newInstance("Tom");//创建实例
        Field dis = cls.getDeclaredField("fName");//获取属性对象
        dis.set(obj,"George");//设置属性值
        System.out.println(dis.get(obj));//获取属性值并打印
    }
}

四、根据类获取成员方法并使用


  • 常用的几个方法:
    • getDeclaredMethod()
    • getDeclaredMethods()
    • getMethods()
    • getMethod()
public class InvokeLearn{
    public static void main(String[] args) throws Exception{
        Class cls = Class.forName("father");
        Constructor[] conArray= cls.getDeclaredConstructors();//所有构造方法
        Constructor newc = conArray[0];
        Object obj = newc.newInstance("JJJ");//创建实例
        Method dis = cls.getDeclaredMethod("show",null);//获取show方法
        dis.invoke(obj, null);//调用show方法
    }
}

以上是关于Java初学者笔记六:反射的主要内容,如果未能解决你的问题,请参考以下文章

java 反射代码片段

反射机制入门

反射机制入门

十六反射

反射机制入门

JAVA中反射机制六(java.lang.reflect包)