反射的概念:
在运行状态中,可以获取任意一个类中的所有属性和方法或者是调用任意一个对象的任意方法和属性。
获取Class对象的方式:
1.类名.class
例如 System.class
每次都需要具体的类和类中一个静态的class方法
2.对象.getClass()
例如 new Person().getClass()
每次都需要具体的类和该类的对象,还要调用getClass方法
3.Class.forName("类名")
例如 Class.forName("java.lang.String")
只需要知道类的名称就可以了
class ReflectDemo
{
public static void main(String[] args) throws Exception
{
String str = "abc";
//三种不同的获取字节码的方法
Class clazz1 = String.class;
Class clazz2 = str.getClass();
Class clazz3 = Class.forName("java.lang.String");
}
}
获取类中构造方法的方式:
1.获取类中所有的构造方法
Constructor[] cons = Class.forName("类名").getConsturctors();
返回一个包含某些
Constructor
对象的数组,这些对象反映此Class
对象所表示的类的所有公共构造方法。import java.lang.reflect.*;
class ReflectConsDemo
{
public static void main(String[] args)throws Exception
{
Constructor[] cons = String.class.getConstructors();
for(int i= 0;i<cons.length;i++)
{
System.out.println(cons[i]);
}
}
}
2.获取类中某一个构造方法
Consturtor con = Class.forName("类名").getConstructor(Stirng.class,int.class);
返回一个
Constructor
对象,它反映此Class
对象所表示的类的指定公共构造方法。import java.lang.reflect.*;
class ReflectConDemo
{
public static void main(String[] args)throws Exception
{
Constructor con = String.class.getConstructor(StringBuffer.class);
String str = (String)con.newInstance(new StringBuffer("java"));
System.out.println(str);
}
}
获取类中成员变量的方式
1.获取共有和父类公有的成员变量
Field getField(String s);
import java.lang.reflect.*;
class Student //被反射的类
{
public String name;
public int age = 12;
public Student()
{
System.out.println("Student Student");
}
public Student(String name,int age) //构造方法重载
{
this.name = name;
this.age = age;
}
}
class ReflectDemo
{
public static void main(String[] ages)throws Exception
{
String studentName = Student.class.getField("name").getName();//获取反射类中成员变量的名称
System.out.println(studentName);
}
}
2.获取类中任意变量(包括私有)
Field getDeclaredField(Stirng s);
setAccessible(ture); (暴力访问:要获取私有的成员变量先要进行取消其权限检查能力)
import java.lang.reflect.*;
class Student //被反射的类
{
public String name;
private int age;
public Student()
{
System.out.println("Student Student");
}
public Student(String name,int age) //构造方法重载
{
this.name = name;
this.age = age;
}
}
class ReflectDemo
{
public static void main(String[] ages)throws Exception
{
String studentAge = Student.class.getField("age").getName();//获取反射类中成员变量的名称
System.out.println(studentAge);
}
}
运行结果:
因为是私有的所以用普通的Field获取不到,应该改成:
import java.lang.reflect.*;
class Student //被反射的类
{
public String name;
private int age;
public Student()
{
System.out.println("Student Student");
}
public Student(String name,int age) //构造方法重载
{
this.name = name;
this.age = age;
}
}
class ReflectDemo
{
public static void main(String[] ages)throws Exception
{
String studentAge = Student.class.getDeclaredField("age").getName();//获取反射类中成员变量的名称
System.out.println(studentAge);
}
}
运行结果:
获取类中成员方法的方式
1.Method[] getMethods();
只获取公共和父类中的方法
2.Method[] getDeclaredMethods();
获取类中的方法包括私有的
该示例在运行时要在Program arguments中添加要执行的类名
p.s.
配置文件:
usb.properties
usb1 = MouseUSB
usb2 = KeyUSB
import java.io.*;
import java.util.*;
public class ReflectTest {
public static void main(String[] args) throws Exception{
/*
*笔记本电脑使用usb设备
*/
NoteBook computer=new NoteBook();
computer.run();
//关联配置文件
File file=new File("usb.properties");
FileInputStream fis=new FileInputStream(file);
//将配置文件信息缓存到集合中
Properties ps=new Properties();
ps.load(fis);
//System.out.println(ps.size());
for(int x=1;x<=ps.size();x++){
String className=ps.getProperty("usb"+x);//获取配置文件中类名
Class clazz=Class.forName(className);//获取类的Class对象
USB usb=(USB)clazz.newInstance();//得到类实例
computer.useUSB(usb);//开始使用
}
fis.close();//关流
}
}
//USB 接口
public interface USB {
void open();
void close();
}
//笔记本电脑
public class NoteBook {
public void run(){
System.out.println("NoteBook is run");
}
public void useUSB(USB usb){
if(usb!=null){
usb.open();
usb.close();
}
}
}
//鼠标
public class MouseUSB implements USB {
public void open() {
System.out.println("Mouse is use");
}
public void close() {
System.out.println("Mouse is close");
}
}
//键盘
public class KeyUSB implements USB {
public void open() {
System.out.println("Key is use");
}
public void close() {
System.out.println("Key is close");
}
}