当前位置: 首页> 文旅> 艺术 > java反射详解

java反射详解

时间:2025/7/13 6:53:06来源:https://blog.csdn.net/xiugtt6141121/article/details/140909804 浏览次数:0次

java反射详解

一、Java反射的基本概念

反射(Reflection)是Java编程语言的一个重要特性,由Smith在1982年首次提出。它允许程序在运行时进行自省(introspect)和操作类的内部结构和属性。简单来说,反射机制指的是程序在运行时能够获取自身的信息,包括类的所有属性和方法,并能动态地调用这些方法或构造器。Java反射机制主要依赖于java.lang.reflect包中的类和接口,这些类和接口提供了丰富的API来操作类、接口、字段、方法和构造器等。

二、Java反射的使用方法

创建一个person类

package com.Month08.Day_04;public class Person {private String name ;private int age ;public Person() {}public Person(String name, int age) {this.name = name;this.age = age;}}

1.方式1:调用Object中的getClass方法:

public class DemoClass01 {public static void main(String[] args) {Person person = new Person();Class<? extends Person> aClass = person.getClass();}
}

2.方式2:不管是基本类型还是引用类型,jvm都为其提供了一个静态成员:class

public class DemoClass01 {public static void main(String[] args) {Class<Person> personClass = Person.class;}
}

3.方式3:Class类中的静态方法:
static Class<?> forName(String className)
className:传递的是类的全限定名(包名.类名)

public class DemoClass01 {public static void main(String[] args) throws ClassNotFoundException {Class<?> aClass = Class.forName("com/Month08/Day_04/Person.java");}
}

三. properties文件结合使用

参数为String形式,可以和properties文件结合使用 , 可以使得构造更灵活

创建properties文件

path=com/Month08/Day_04/Person.java

实现类

package com.Month08.Day_02;import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;public class PropertiesClass {public static void main(String[] args) throws IOException {// 创建properties对象Properties properties = new Properties();// 创建FileInputStream流对象FileInputStream fileInputStream = new FileInputStream("F:\\JavaProject\\Project\\src\\com\\Month08\\Day_02\\pro.properties");// 将Io流对象传入properties中properties.load(fileInputStream);// 获取到键对应的值String username = properties.getProperty("path");System.out.println(username);}
}

四. 获取Class对象中的构造方法

1.获取所有public的构造方法

1.Class类中的方法:
getConstructors() -> 获取所有public的构造

public class Demo03GetConstructor {public static void main(String[] args) {//获取Class对象Class<Person> aClass = Person.class;//获取所有public的构造Constructor<?>[] constructors = aClass.getConstructors();for (Constructor<?> constructor : constructors) {System.out.println(constructor);}}
}

2.获取空参构造_public

1.Class类中的方法:
getConstructor(Class<?>… parameterTypes)->获取指定的public的构造
parameterTypes:可变参数,可以传递0个或者多个参数
a.如果获取的是空参构造:参数不用写
b.如果获取的是有参构造:参数写参数类型的class对象

2.Constructor类中的方法:
T newInstance(Object…initargs) -> 创建对象
initargs:传递的是构造方法的实参
a.如果根据无参构造new对象,initargs不写了
b.如果根据有参构造new对象,initargs传递实参

public class Demo04GetConstructor {public static void main(String[] args)throws Exception {//获取Class对象Class<Person> aClass = Person.class;Constructor<Person> constructor = aClass.getConstructor();System.out.println("constructor = " + constructor);/*好比是Person person = new Person()*/Person person = constructor.newInstance();//好比是直接输出对象名,默认调用toStringSystem.out.println(person);}
}

3.利用空参构造创建对象的快捷方式_public

Class类中的方法:
newInstance() -> 根据空参构造创建对象

前提:被反射的类中必须有public的空参构造

public class Demo05GetConstructor {public static void main(String[] args)throws Exception {//获取Class对象Class<Person> aClass = Person.class;/*好比是Person person = new Person()*/Person person = aClass.newInstance();//好比是直接输出对象名,默认调用toStringSystem.out.println(person);}
}

4.利用反射获取有参构造并创建对象_public

1.Class类中的方法:
getConstructor(Class<?>… parameterTypes)->获取指定的public的构造
parameterTypes:可变参数,可以传递0个或者多个参数
a.如果获取的是空参构造:参数不用写
b.如果获取的是有参构造:参数写参数类型的class对象

2.Constructor类中的方法:
T newInstance(Object…initargs) -> 创建对象
initargs:传递的是构造方法的实参
a.如果根据无参构造new对象,initargs不写了
b.如果根据有参构造new对象,initargs传递实参

public class Demo06GetConstructor {public static void main(String[] args)throws Exception {//获取Class对象Class<Person> aClass = Person.class;Constructor<Person> constructor = aClass.getConstructor(String.class, Integer.class);System.out.println("constructor = " + constructor);//创建对象-> 好比是Person person = new Person("三上",26)Person person = constructor.newInstance("三上", 26);//好比是直接输出Person对象,直接调用toStringSystem.out.println(person);}
}

5.利用反射获取私有构造(暴力反射)

  1. getDeclaredConstructors()获取所有构造方法,包括private

  2. getDeclaredConstructor(类<?>… parameterTypes) -> 获取指定构造,包括private
    parameterTypes:参数类型的class对象

  3. Constructor有一个父类叫做AccessibleObject ,里面有一个方法
    void setAccessible(boolean flag) -> 修改访问权限
    flag为true:解除私有权限

public class Demo07GetConstructor {public static void main(String[] args) {Class<Person> aClass = Person.class;Constructor<?>[] dc = aClass.getDeclaredConstructors();for (Constructor<?> constructor : dc) {System.out.println(constructor);}}
}
public class Demo08GetConstructor {public static void main(String[] args)throws Exception {Class<Person> aClass = Person.class;Constructor<Person> dc = aClass.getDeclaredConstructor(String.class);dc.setAccessible(true);//解除私有权限->暴力反射Person person = dc.newInstance("三上");System.out.println(person);}
}
关键字:java反射详解

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

责任编辑: