码迷,mamicode.com
首页 > 编程语言 > 详细

java反射机制

时间:2018-05-11 20:18:16      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:name   函数   out   加载   pre   class   没有   ide   构造   

反射机制定义:

  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);
	
	}
}

  

 

  

java反射机制

标签:name   函数   out   加载   pre   class   没有   ide   构造   

原文地址:https://www.cnblogs.com/MyJavaStudy/p/9025632.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!