【Java】之反射总结

CSDN话题挑战赛第2期
参赛话题:学习笔记

学习之路,长路漫漫,写学习笔记的过程就是把知识讲给自己听的过程。这个过程中,我们去记录思考的过程,便于日后复习,梳理自己的思路。学习之乐,独乐乐,不如众乐乐,把知识讲给更多的人听,何乐而不为呢?

目录

一、反射概述

1.作用

2.优点

二、Class类

1.获取Class对象的三种方法

1.Class.forName("全类名")

2.类名.class

3.对象.getClass()

2.获取功能

1.获取成员变量

2.获取构造方法

3.获取成员方法

4.获取类名


一、反射概述

程序通过类创建对象,反射将这一过程进行反转,通过实例化对象来获取所属类的信息。

1.作用

在程序运行状态时,构造任意一个类的对象、获取任意一个对象所属的类的信息、调用任意一个类的成员变量和方法、获取任意一个对象的属性和方法。

2.优点

可以在程序运行期间动态的创建和编译对象,不需要再次重新编译,就可以更新。

二、Class类

1.获取Class对象的三种方法

1.Class.forName("全类名")

将字节码文件加载进内存,返回Class对象

1.举例

定义一个Student类,获取Class对象

2.代码

package itcast;

public class Student {
	private String name;
	private int age;
	public Student(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + "]";
	}
	
}
package itcast;

public class ReflectDemo {
	public static void main(String[] args) throws Exception {
		Class cls1=Class.forName("itcast.Student");
		System.out.println(cls1);
	}
}

3.执行结果

 

相关报错

Exception in thread "main" java.lang.ClassNotFoundException

原因:

Class.forName()里的包或类写错了

解决方法

复制获取Class对象的类和包,粘上去

2.类名.class

通过类名的属性class获取

1.举例

定义一个Student类,获取Class对象

2.代码

package itcast;

public class ReflectDemo {
	public static void main(String[] args) throws Exception {
		Class cls1=Student.class;
		System.out.println(cls1);
	}
}

3.执行结果

3.对象.getClass()

1.举例

定义一个Student类,获取Class对象

2.代码

package itcast;

public class ReflectDemo {
	public static void main(String[] args) throws Exception {
		Student stu=new Student();
		Class cls1=stu.getClass();
		System.out.println(cls1);
	}
}

3.执行结果

2.获取功能

1.获取成员变量

操作

1.设置值

        set(Object obj,Object value)

2.获取值

        get(Object obj)

getFields()

获取所有public修饰的的成员变量

代码

package itcast;

public class Student {
	public String name;
	public int age;
	public Student() {
		super();
	}
	public Student(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age + "]";
	}
	
}
package itcast;

import java.lang.reflect.Field;

public class ReflectDemo {
	public static void main(String[] args){
		Class StudentClass=Student.class;
		Field[] field=StudentClass.getFields();
		for (Field field2 : field) {
			System.out.println(field2);
		}
	}
}

执行结果

 

getField(String name)

指定名称的public修饰的成员变量

getDeclaredFields()

获取所有的的成员变量,不考虑修饰符

getDeclaredField(String name)

指定名称的成员变量,不考虑修饰符

2.获取构造方法

创建对象

        T  newInstance(Object... initargs)

        如果使用的是无参构造方法创建对象,使用Class对象的newInstance

getConstructors()

代码

package itcast;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;

public class ReflectDemo {
	public static void main(String[] args) throws Exception{
		Class StudentClass=Student.class;
		Constructor constructor=StudentClass.getConstructor(String.class,int.class);
		System.out.println(constructor);
		Object student1=constructor.newInstance("老六",18);
		System.out.println(student1);
		Object student2=StudentClass.newInstance();//无参函数时使用
		System.out.println(student2);
	}
}

执行结果

getConstructor(类... parameterTypes)

getDeclaredConstructor(类... parameterTypes)

getDeclaredConstructors()

3.获取成员方法

getMethods()

getMethod(String name,类... parameterTypes)

getDeclaredMethods()

getDeclaredMethod(String name,类... parameterTypes)

4.获取类名

getName() 

你可能感兴趣的:(java,java,开发语言)