java反射方法和使用详解

乔欣 Java教程 发布时间:2023-02-21 16:25:51 阅读数:627 1
下文笔者讲述java反射方法的使用示例,如下所示

反射简介

 
反射机制:
   对运行中的任意一个类
   获取类的所有属性及方法
在java中,只要有类的名称,则可以使用反射机制获取类的所有信息 
例:反射的示例分享
 
public class Book {
    private Integer id;
    private String name;
    public Integer age;

    public Book() {
        System.out.println("Public 无参构造函数");
    }
    public Book(String name) {
        System.out.println("Public 带参构造函数");
    }
    private Book(String name,Double price){
        System.out.println("Private 带两参构造函数");
    }

    public void printAll(){
        System.out.println("公开方法");
    }

    private void printOne(){
        System.out.println("私有方法");
    }
}

获取类的三种方式

使用反射
须先得到代表类的字节码的Class对象
Class类用于表示.class文件(字节码)

方式1:使用Class.forName

使用 Class.forName(String classPath)时
请求参数classPath写需要反射的类名
一般是以包名.类名。

 try {
    Class clz = Class.forName("com.entity.Book");
  } catch (ClassNotFoundException e) { 
    e.printStackTrace();
  }
  

方式2:使用类名.class

 
Class clz = Book.class;

方式3:对象.getClass()

 
Book book = new Book();
Class clz = book.getClass();   

反射获取构造函数

getDeclaredConstructors(); 获取所有的构造函数
getDeclaredConstructor(参数类型); 获取一个指定参数类型的构造函数
getConstructors(); 获取所有公共的构造函数
getConstructor(参数类型); 获取一个指定参数类型的、public修饰的构造函数
例:获取所有的构造函数
       
Constructor[] constructors = clz.getDeclaredConstructors();
//获取单个所有的构造函数
try {
	Constructor constructor =               
	clz.getDeclaredConstructor(String.class);
} catch (NoSuchMethodException e) {
	e.printStackTrace();
}

//获取所有的公开构造函数
Constructor[] constructors1 = clz.getConstructors();
//获取单个公开构造函数
try {
	Constructor constructor = clz.getConstructor(String.class);
} catch (NoSuchMethodException e) {
	e.printStackTrace();
}  

获取名字

返回类型:String,可以反射类名、方法名和构造函数名等等。

getName();    //获取全名  例如:com.bean.Book
getSimpleName()  //获取类名 例如:Book
    

Class clz = Book.class;
String name1 = clz.getName();
String name2 = clz.getSimpleName();

获取包

   
返回类型:Package
Package aPackage = clz.getPackage();

获取接口

getInterfaces(),
返回类型:Class[] interfaces
Class[] interfaces = clz.getInterfaces();

获取父类/超类

getSuperclass()
返回类型:Class superclass

Class superclass = clz.getSuperclass();
   

实例化对象

语法糖:newInstance(Object initargs)
   
第一种方式
Class clz = Book.class;
  Object obj =  clz.newInstance(); //将创建一个无参book对象
 
第二种方式
Class clz = Book.class;
Constructor constructor = clz.getDeclaredConstructor();   //获得无参构造
Object obj = constructor.newInstance();    //实例化book对象

设置访问属性

clz.setAccessible(true)  //可访问
clz.setAccessible(false)  //不可访问

//默认是false   
Field id = clz.getField("age"); //age字段  
id.setAccessible(true); //设为可访问
id.setAccessible(false);    //设为不可访问

获取方法

getMethods():获取所有的公共方法,注意,它会将系统自带的方法也得到
getMethod(String name):获取单个公共方法,由参数指定方法名
getDeclaredMethods():获取所有的方法,注意:它不会获取系统自带的方法
getDeclaredMethod(String name):获取单个的所有方法 参数是可指定方法名
   Class clz = Class.forName("Book");
   Method[] methods = clz.getMethods();    //获取所有的公共方法
   for (Method method : methods) {
       System.out.println(method.getName());
   } 
    Method method = clz.getMethod("printAll"); // 获取单个公共方法
    method.invoke(clz.newInstance(), null); // 调用方法
Method[] methods = clz.getDeclaredMethods(); //获取所有方法
for (Method method1 : methods) {
   System.out.println(method1.getName());
}
Method method1 = clz.getDeclaredMethod("printOne");    //获取单个公共方法
System.out.println(method1.getName());

调用方法

method.invoke(Object obj,Object... args)
obj:如果是实例方法,则传入该方法的类对象;如果是静态方法,写null。
args:方法的参数值,没有写null,或不写都行

// 获取单个的public方法,无法获取private方法
Method method = clz.getMethod("printAll");

反射使用方法

method.invoke(clz.newInstance(),null); 
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaCourse/202302/5862.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者