Java反射机制:
反射机制可以允许我们实例化一个类,调用方法操作属性从编码器改为运行期决定。并且也可以在运行期间动态的得知一个类的情况(它有哪些方法和属性等)。
反射机制可以大大提高代码的灵活度,但是实际开发中使用要适度,过渡使用反射会降低代码的运行效率。
反射第一步:获取要操作的类的类对象
Java中每个被JVM加载的类在JVM内部都有且只有一个类对象(Class实例),与之对应。通过某个类的类对象可以得知这个类的信息(有哪些方法,哪些属性等等信息)并且可以进行实例化等操作。
想获取一个类的类对象方式:
1)类型.class
每个类都有一个静态属性:class,可以直接获取这个类的类对象。当我们直接获取这个类的类对象,当我们明确需要获取某个类的类对象时可以使用这种方式。
2)通过Class的静态方法:forName,这种方式我们可以指定想加载的类的名字来获取该类的类对象。
3)通过类加载器ClassLoader
package reflect;
import java.lang.reflect.Method;
public class ReflectDemo1 {
public static void main(String[] args) throws ClassNotFoundException {
//查看Person类的信息
/*
* 1:先获取Person的类对象
*/
//Class cls = Person.class;
/*
* Class.forName(String className)
* 这里在加载一个类时指定的字符串为加载类的
* 完全限定名:包名.类名
*/
Class cls = Class.forName("reflect.Person");
String name = cls.getName();
System.out.println(name);
Method[] methods = cls.getMethods();
for(Method method:methods) {
System.out.println(method.getName());
}
}
}
通过类对象快速创建实例:Object obj = cls.newInstance();
package reflect;
import java.util.Scanner;
/**
* 通过类对象快速创建实例
* @author ta
*
*/
public class ReflectDemo2 {
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
/*
* 实例化Person
*/
Person p = new Person();
System.out.println(p);
/*
* 利用反射
*/
Scanner scanner = new Scanner(System.in);
Class cls = Class.forName(scanner.nextLine());
/*
* java.util.Date
* java.util.ArrayList
*
* Class有一个快速实例化对象的方法:
* newInstance()
* 但是需要注意,该Class实例表示的类必须要
* 包含无参构造方法,否则不能使用这种方式
* 实例化
*/
Object obj = cls.newInstance();
System.out.println(obj);
}
}
利用反射调用方法:
package reflect;
import java.lang.reflect.Method;
/**
* 利用反射调用方法
* @author ta
*
*/
public class ReflectDemo3 {
public static void main(String[] args) throws Exception {
Person p = new Person();
p.sayHello();
/*
* 利用反射
*/
//1 加载类对象
Class cls = Class.forName("reflect.Person");
//2 实例化
Object o = cls.newInstance();
/*
* 3通过类对象获取其定义的方法
* Method的每一个实例用于表示一个类中
* 的一个具体的方法
*/
Method method = cls.getMethod("sayHello",null);
/*
* 4调用该方法
*/
method.invoke(o, null);
}
}
调用有参方法:
package reflect;
import java.lang.reflect.Method;
/**
* 调用有参方法
* @author ta
*
*/
public class ReflectDemo4 {
public static void main(String[] args) throws Exception {
/*
* Person p = new Person();
*/
Class cls = Class.forName("reflect.Person");
Object o = cls.newInstance();
/*
* p.sayHello("张三");
*
* 1:获取Person的sayHello方法
* void sayHello(String)
*/
Method method = cls.getMethod(
"sayHello", String.class
);
/*
* 2:调用o这个对象的sayHello方法并
* 传入实际参数
*/
method.invoke(o, "张三");
/*
* p.sayHello("李四",22)
*/
Method method2 = cls.getMethod(
"sayHello", String.class,int.class
);
method2.invoke(o,"李四",22);
}
}
测试反射功能的类:
package reflect;
/**
* 测试反射功能的类
* @author ta
*
*/
public class Person {
public void sayHello() {
System.out.println("hello!");
}
public void sayHello(String name) {
System.out.println("hello!"+name);
}
public void sayHello(String name,int age) {
System.out.println("hello!"+name+",您今年"+age+"岁.");
}
public void sayHi() {
System.out.println("hi!");
}
}
最后
感谢你看到这里,看完有什么的不懂的可以在评论区问我,觉得文章对你有帮助的话记得给我点个赞,每天都会分享java相关技术文章或行业资讯,欢迎大家关注和转发文章!