java中的反射

1、类初始化时机

1/1 创建类的实例

1/2 访问类的静态变量,或者为静态变量赋值

1/3 调用类的静态方法

1/4 使用反射方式来强制创建某个类或接口对应的java.lang.Class对象

1/5 初始化某个类的子类

1/6 直接使用java.exe命令来运行某个主类

 

2、获取Class对象的三种方式

2/1 Object中的public final<?> getClass()

      此方法不是静态的,必须使用对象的引用来调用

Student stu = new Student();//此过程会产生一个Student对象空间和一个Class对象空间
Class stuClass = stu.getClass();

2/2 class属性:任何的数据类型(包括基本的数据类型)都有一个静态的class属性,它可以获取这个类的Class       

      

Student stu = new Student();
Class StuClass = Student.class;

2/3 Class类中有一个静态方法(常用方法)

Class forName(StringclassName):className必须是全名限定的类名,即带包名的,否则会抛出
java.lang.ClassNotFoundException异常
Student stu = new Student();
Class stuClass = Class.forName("java.itcast.Student");

 

3、通过反射获取无参或有参构造方法

3/1 批量获取

public Constructor[] getConstruceors():获取所有公共构造方法
public Constructor[]getDeclaredConstructors():获取所有的(包括私有的)构造方法

3/2 单个获取

public Constructor getConstructor():获取一个共有的构造方法
public ConstructorgetDeclaredConstructor():获取某个构造方法

 

4、成员方法

public T newInstance():创建此 Class 对象所表示的类的一个新实例

使用方法:构造器.newInstance()

构造器如果是私有的,想修改构造器中参数的值,需要设置暴力访问;

例:

			class Student{
				String name;
				private Student(String name){
					this.name = name;
				}
				
				……
			}
			
			class Demo{
				public static void main(String[] args){
					Class class01 = Student.class;//获取Class对象
					
					Constructor con = class01.getConstructor(String.class);//获取Class对象所表示的类的私有带参构造方法
					con.setVisiable(true);//设置暴力访问
					Object obj = con.newInstance("宋茜");//使用构造方法创建一个Class对象所表示的类的实例
					Student stu = (Student)obj;//下转型
					System.out.println(stu.getName());
					
				}
			}


 

5、通过反射获取成员变量

5/1 批量获取

Field[] getFields():获取所有共有的成员变量

Field[] getDeclaredFields():获取所有的成员变量(包括私有的)

5/2 单个获取

Field getField():获取公有的成员变量(不包含继承的)

Filed getDeclaredField():获取任意的成员变量(不包含继承的)

5/3 给成员变量赋值

set(Object obj,Object value)

给成员变量赋值前一定要、确保堆中有对象空间

私有变量赋值前要设置暴力访问

例:

Field field01 =class01.getDeclaredField("name");//获取name属性
Constructor con = class01.getConstructor();//获取构造方法
Object obj = con.newInstance();//实例化
Student student = (Student)obj;//转型
field01.setAccessible(true);//设置暴力访问
field01.set(student, "宋茜");//设置属性值
System.out.println(student.getName());


 

 

6、通过反射获取成员方法

6/1 批量获取

Mthord[] getMethords():获取所有公有的成员方法,包含继承的方法

Methord[] getDeclareMethords():获取所有的成员方法(包括私有的,不包含继承的方法)

6/2 获取单个的

Methord getMethord():获取单个的共有的成员方法

Methord getDeclareMethord():获取某个单个的成员方法

6/3 调用方法

publicObject invoke(Object obj,Object... args)

传参给成员方法时要先实例化,在堆中产生对象空间

对私有成员方法传参是要先设置暴力访问

你可能感兴趣的:(java,反射)