• java反射机制


    反射机制定义:

      JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

    Class类定义:

      类是具有相同属性和行为的一类事物,类本身也可以进行抽象,因为类们也具有相同的属性和行为,比如都具有(属性,构造函数,方法,都能调用方法,)所以将类们又抽象成一个类Class。Class类继承object类。用于操纵类的属性,方法,构造器。

      Class 没有公共构造方法。Class 对象是在加载类时由 Java 虚拟机以及通过调用类加载器中的 defineClass 方法自动构造的。

    3中方法获取类的类对象:

      <1>根据全类名字符串得到类的方法和属性Class.forName(“类的全路径”)

       Class<?> clas=Class.forName("java.lang.String");

      <2>通过类的名字打点class,如Person.class

       Class<Person> cals=Person.class;

      <3>通过调用该类的对象.getClass()方法

    下面是反射机制的实例:

    Person类:

    package com.rl.reflect;
    
    public class Person {
    	private String name;
    	private String address;
    	private Integer age;
    	private String desc;
    	public Person(){
    		
    	}
    	public Person(String name, String address, Integer age, String desc) {
    		super();
    		this.name = name;
    		this.address = address;
    		this.age = age;
    		this.desc = desc;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public String getAddress() {
    		return address;
    	}
    	public void setAddress(String address) {
    		this.address = address;
    	}
    	public Integer getAge() {
    		return age;
    	}
    	public void setAge(Integer age) {
    		this.age = age;
    	}
    	public String getDesc() {
    		return desc;
    	}
    	public void setDesc(String desc) {
    		this.desc = desc;
    	}
    	@Override
    	public String toString() {
    		return "Person [name=" + name + ", address=" + address + ", age=" + age + ", desc=" + desc + "]";
    	}
    	
    	public static void test(){
    		System.out.println("this is a test");
    	}
    }
    

      

    测试类:

     通过反射获取Person类中的构造器 并创建实例对象,再通过反射调用方法为对象赋值。

    public class Test3 {
    	public static void main(String[] args) throws Exception{
    		Class<?> clas=Class.forName("com.rl.reflect.Person");
    		//根据无参构造器创建对象
    		Constructor<?> constructor=clas.getDeclaredConstructor(new Class[]{});
    		/* public T newInstance(Object ... initargs)  可变参数应该放数组*/
    		
    		//反向调用方法
    		Method test=clas.getDeclaredMethod("test", new Class[]{});
    		Object object=constructor.newInstance(new Object[]{});
    		test.invoke(object, new Object[]{});
    		
    		//调用setName()  并输出toString
    		Method setName=clas.getDeclaredMethod("setName", new Class[]{String.class});
    		Method toString=clas.getDeclaredMethod("toString", new Class[]{});
    		setName.invoke(object, new Object[]{"王五"});
    		
    		//输出
    		System.out.println(object);
    		toString.invoke(object, new Object[]{});
    		
    		
    		System.out.println(object);
    		Constructor<Person> cons=(Constructor<Person>) clas.getDeclaredConstructor(new Class[]{String.class,String.class,Integer.class,String.class});
    		Person per=cons.newInstance(new Object[]{"张三","成都",20,"爱好打球"});
    	
    		System.out.println(per);
    	
    	}
    }
    

      

     

      

  • 相关阅读:
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    互联网大厂CTO详解5大软件架构,看完这篇你就秒懂
    5-10年的DBA如何独当一面?这10个建议送给你(附图书工具推荐)
    2020 从新开始:你应该知道的Oracle认证新变化
    Centos7部署NFS实战
    你的公司,远程办公多久了?
    PostgreSQL的几种分布式架构对比
    数据库周刊 | DBA 核心技能
    理解redis 分布式中的分片机制
  • 原文地址:https://www.cnblogs.com/MyJavaStudy/p/9025632.html
Copyright © 2020-2023  润新知