Java 反射机制与类操作

反射机制

反射指对象的反向处理操作,所谓的反向处理指的是根据对象来获取对象的来源信息

调用Object类提供的getClass()方法:
public final native Class<?> getClass();

import java.util.Date;

public class Test {
    public static void main(String[] args) {
        Date date = new Date();
        System.out.println(date.getClass());//通过对象取得类的信息
    }
}

反射实例化对象

反射举例

public class Test{
    public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
        Class<?> cls = Class.forName("java.util.Date");
        Object obj = cls.newInstance();//相当于new java.util.Date();
        System.out.println(obj);
    }
}

反射与类操作

取得父类信息:
1、取得包名称

//取得包名称
public static void main(String[] args) {
	Class<?> cls = CLS.class ; // 取得Class类对象
	System.out.println(cls.getPackage().getName());
}

2、取得实现的父接口对象

//取得父类
public static void main(String[] args) {
	Class<?> cls = CLS.class ; // 取得Class类对象
	// 取得Package名称
	System.out.println(cls.getPackage().getName());
	// 取得父类名称
	System.out.println(cls.getSuperclass().getName());
	// 取得实现的父接口对象
	Class<?>[] iClass = cls.getInterfaces() ;
	for (Class<?> class1 : iClass) {
	System.out.println(class1.getName());
	}
}

3、反射调用构造方法

//反射调用构造方法
class Person{
    private String name;
    private int age;

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
        System.out.println("有参构造方法");
    }
    public Person(){
        System.out.println("无参构造方法实现");
    }
}

public class Test{
    public static void main(String[] args) throws NoSuchMethodException {
        Class<?> cls = Person.class;

        //取得指定的构造方法
        Constructor<?> constructor = cls.getConstructor(String.class, int.class);
        System.out.println(constructor);

        //取得类中所有构造方法
//        Constructor<?>[] constructors = cls.getConstructors();
//        for (Constructor<?> constructor : constructors){
//            System.out.println(constructor);
//        }
    }
}

4、通过Constructor类实例化对象

//实例化无参构造
public static void main(String[] args) throws IllegalAccessException, InstantiationException {
	Class<?> cls = Person.class;
	//通过反射实例化对象时,只能实例化类的无参构造
	System.out.println(cls.newInstance());
}
//实例化有参构造
public static void main(String[] args) throws IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {
	Class<?> cls = Person.class;
	Constructor<?> constructor = cls.getConstructor(String.class, int.class);
	//通过newInstance实现有参构造
	System.out.println(constructor.newInstance("张三",23));
}

5、反射调用普通方法

//取得一个类的全部普通方法
class Person{
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public void eat(String name){
        System.out.println(name +"吃午饭");
    }

    public void school(String name, int age){
        System.out.println("姓名:"+name+age+"岁了");
    }
}

public class Test{
    public static void main(String[] args) {
        Class<?> cls = Person.class;
        Method[] methods = cls.getMethods();
        for (Method method : methods){
            System.out.println(method);
        }
    }
}

6、反射调用Getter、Setter方法

public static void main(String[] args) throws Exception {
	Class<?> cls = Class.forName("reflect.Person");
	// 调用类中的普通方法都必须有实例化对象
	Object obj = cls.newInstance();
	// 取得setName这个方法的实例化对象,设置方法名称与参数类型
	Method setMethod = cls.getMethod("setName", String.class);
	// 通过Method类对象调用指定的方法,调用方法需要有实例化对象
	// 同时传参
	setMethod.invoke(obj, "zhangsan"); 
	// 相当于Person对象.setName("yuisama");
	Method getMethod = cls.getMethod("getName");
	Object result = getMethod.invoke(obj); 
	// 相当于Person对象.getName() ;
	System.out.println(result) ;
}

7、通过反射操作属性

//反射操作属性
public class Test {
	public static void main(String[] args) throws Exception {
		Class<?> cls = Class.forName("reflect.Person") ;
		// 实例化本类对象
		Object obj = cls.newInstance() ;
		// 操作name属性
		Field nameField = cls.getDeclaredField("name") ;
		nameField.set(obj, "yuisama") ; // 相当于对象.name = "yuisama"
		System.out.println(nameField.get(obj)); // 取得属性
	}
}

猜你喜欢

转载自blog.csdn.net/ly52014/article/details/89104814
今日推荐