zoukankan      html  css  js  c++  java
  • 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);
    	
    	}
    }
    

      

     

      

  • 相关阅读:
    【luogu T34117 打油门】 题解
    【luogu P1774 最接近神的人_NOI导刊2010提高(02)】 题解
    【luogu P1462 通往奥格瑞玛的道路】 题解
    【luogu P3808 AC自动机(简单版)】 模板
    替罪羊树~讲解
    【luogu P3369 【模板】普通平衡树(Treap/SBT)】 模板 Scapegoat Tree
    【luogu P1801 黑匣子_NOI导刊2010提高(06)】 题解
    【luogu P2590 [ZJOI2008]树的统计】 题解
    【luogu P3398 仓鼠找sugar】 题解
    【luogu P3884 [JLOI2009]二叉树问题】 题解
  • 原文地址:https://www.cnblogs.com/MyJavaStudy/p/9025632.html
Copyright © 2011-2022 走看看