想要理解java反射机制的含义,应该再了解两个概念,编译期和运行期,编译期就是编译器帮你把源代码翻译成机器能识别的代码,比如编译器把java代码编译成jvm识别的字节码文件,而运行期指的是将可执行文件交给操作系统去执行,java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。简单说,反射机制值得是程序在运行时能够获取自身的信息。在java中,只要给定类的名字,那么就可以通过反射机制来获得类的所有信息。
java反射机制提供了如下的功能:在运行时能够判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任一对象的方法;在运行时创建新类对象。
需要知道的是,反射也有缺点。反射机制的功能非常强大,但不能滥用。一是因为性能问题,Java反射机制中包含了一些动态类型,所以Java虚拟机不能够对这些动态代码进行优化。因此,反射操作的效率要比正常操作效率低很多。我们应该避免在对性能要求很高的程序或经常被执行的代码中使用反射。二是安全限制,使用反射通常需要程序的运行没有安全方面的限制,如果一个程序对安全性提出要求,则最好不要使用反射。
Java反射机制为程序很大程度上的提高了灵活性和扩展性,可以节省很多资源,反射机制是java这种动态语言一个关键,所以零基础的朋友们在初始学习的时候,对java反射机制有通透的理解的话,在java视频教程中学习关于反射的内容,肯定是会有所帮助的。
package omg;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* Created with IntelliJ IDEA.
*
* @Author: DIXian
* @Date: 2021/06/28/23:48
*/
public class Test22 {
public static void main(String[] args) throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, NoSuchFieldException {
Class clazz = Person.class;
//需要提供自定义类的构造方法
Constructor tom = clazz.getConstructor(String.class, int.class);
Object tom1 = tom.newInstance("Tom", 12);
Person p = (Person) tom1;
System.out.println(p.toString());
//调用属性
Field age = clazz.getDeclaredField("age");
age.set(p,15);
System.out.println(p.toString());
//调用方法
Method show = clazz.getDeclaredMethod("show");
show.invoke(p);
}
}
class Person{
String name;
int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public Person() {
}
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 "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public void show(){
System.out.println("我是你哥哥");
}
}
通过反射获取Class实例的方法
上代码:
package omg;
/**
* Created with IntelliJ IDEA.
*
* @Author: DIXian
* @Date: 2021/06/29/23:37
*/
public class Test23 {
public static void main(String[] args) throws ClassNotFoundException {
//通过反射获取Class实例的方法
//第一种:通过调用运行时类的属性.class
Class clazz = Person1.class;
//第二种:通过对象实例调用getclass()方法
Person1 person1 = new Person1();
Class aClass = person1.getClass();
//第三种Class类的静态方法:forName()方法
Class aClass1 = Class.forName("omg.Person1");
System.out.println(clazz == aClass);
System.out.println(clazz == aClass1);
System.out.println(clazz);
//第四种,通过类的加载器调用loadClass()方法
ClassLoader classLoader = Person1.class.getClassLoader();
Class aClass2 = classLoader.loadClass("omg.Person1");
System.out.println(clazz == aClass2);
}
}
class Person1{
String name;
int age;
public Person1(String name, int age) {
this.name = name;
this.age = age;
}
public Person1() {
}
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 "Person1{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}