java反射(1)

反射概述
    * JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;
    * 对于任意一个对象,都能够调用它的任意一个方法和属性;
    * 这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
    * 要想解剖一个类,必须先要获取到该类的字节码文件对象。
    * 而解剖使用的就是Class类中的方法,所以先要获取到每一个字节码文件对应的Class类型的对象。

反射的三个阶段

                 

三种方式
    * a:Object类的getClass()方法,判断两个对象是否是同一个字节码文件
    * b:静态属性class,锁对象
    * c:Class类中静态方法forName(),读取配置文件

范例:

hello.java

import com.ldw.bean.Person;


public class helloworld {

	public static void main(String[] args) throws ClassNotFoundException{

			Class clazz1 = Class.forName("com.ldw.bean.Person");
			Class clazz2 = Person.class;
			
			Person p = new Person();
			Class clazz3 = p.getClass();
			System.out.println("====" + clazz1);
			System.out.println("====" + clazz2);
			System.out.println("====" + clazz3);
			System.out.println(clazz1 == clazz2);
			System.out.println(clazz3 == clazz2);
		
	}
}

Person.java

package com.ldw.bean;

public class Person {
	
	private String name;
	private int age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Person other = (Person) obj;
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
	
	

}

输出:

====class com.ldw.bean.Person
====class com.ldw.bean.Person
====class com.ldw.bean.Person
true
true

利用反射读取配置文件:

config.properties

com.ldw.test.Apple

refelect_test1.java

package com.ldw.test;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;

public class refelect_test1 {
	
	public static void main(String[] args){
		JuiceMaker jm = new JuiceMaker();
		//jm.run(new Apple());
		//jm.run(new Orange());
		
		BufferedReader br;
		try {
			br = new BufferedReader(new FileReader("config.properties"));
			//利用反射读取配置文件
			Class<?> clazz = Class.forName(br.readLine());
            //Class类的newInstance()方法是使用该类无参的构造函数创建对象
			Fruit apple = (Fruit) clazz.newInstance();
			System.out.println("clazz====" + clazz);
			jm.run(apple);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

}

interface Fruit{
	public void squeez();
}

class Apple implements Fruit{
	@Override
	public void squeez(){
		System.out.println("this is apple juice=====");
	}
}

class Orange implements Fruit{
	@Override
	public void squeez(){
		System.out.println("this is orange juice=====");
	}
}

class JuiceMaker{
	public void run(Fruit fruit){
		fruit.squeez();
	}
}

输出

clazz====class com.ldw.test.Apple
this is apple juice=====

Class类的newInstance()方法是使用该类无参的构造函数创建对象, 如果一个类没有无参的构造函数, 就不能这样创建了,可以调用Class类的getConstructor(String.class,int.class)方法获取一个指定的构造函数然后再调用Constructor类的newInstance("张三",20)方法创建对象

Person.java

package com.ldw.bean;

public class Person {
	
	private String name;
	private int age;
	
	
	public Person() {
		super();
	}
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Person other = (Person) obj;
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
	
	

}

refelect_test2.java

package com.ldw.test;

import java.io.BufferedReader;
import java.io.FileReader;
import java.lang.reflect.Constructor;

import com.ldw.bean.Person;

public class refelect_test2 {
	/*
	 * Constructor
	* Class类的newInstance()方法是使用该类无参的构造函数创建对象, 
	* 如果一个类没有无参的构造函数, 就不能这样创建了,
	* 可以调用Class类的getConstructor(String.class,int.class)方法
	* 获取一个指定的构造函数然后再调用Constructor类的newInstance("张三",20)方法创建对象
	 */

	public static void main(String[] args){
		try {
			Class<?> clazz = Class.forName("com.ldw.bean.Person");
			Constructor<?> c = clazz.getConstructor(String.class, int.class);
			System.out.println("clazz====" + clazz);
			Person p = (Person) c.newInstance("zhangsan", 22);
			System.out.println(p);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

}

输出:

clazz====class com.ldw.bean.Person
Person [name=zhangsan, age=22]

利用反射修改参数,调用方法:

Person.java

package com.ldw.bean;

public class Person {
	
	public String name;
	private int age;
	
	
	public Person() {
		super();
	}
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Person other = (Person) obj;
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
	
	public void eat(){
		System.out.println("eat==没有参数===");
	}
	
	public void eat(int num) {
		System.out.println("eat==有参数===" + "参数是==="+ num);
	}

}

refelect_test2.java

package com.ldw.test;

import java.io.BufferedReader;
import java.io.FileReader;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

import com.ldw.bean.Person;

public class refelect_test2 {
	/*
	 * Constructor
	* Class类的newInstance()方法是使用该类无参的构造函数创建对象, 
	* 如果一个类没有无参的构造函数, 就不能这样创建了,
	* 可以调用Class类的getConstructor(String.class,int.class)方法
	* 获取一个指定的构造函数然后再调用Constructor类的newInstance("张三",20)方法创建对象
	 */

	public static void main(String[] args){
		try {
			Class<?> clazz = Class.forName("com.ldw.bean.Person");
			Constructor<?> c = clazz.getConstructor(String.class, int.class);
			System.out.println("clazz====" + clazz);
			//有参构造函数的使用方法
			Person p = (Person) c.newInstance("zhangsan", 22);
			System.out.println(p);
			System.out.println("=========有参构造============");
			/*pulbic的类型可以这样修改
			Field f = clazz.getField("name");
			f.set(p, "lisi");
			*/
			Field f = clazz.getDeclaredField("name");
			f.setAccessible(true);
			f.set(p, "lisi");
			System.out.println("clazz.getField('name')====" + f);
			System.out.println(p);
			System.out.println("=========修改参数============");
			//调用无参数函数
			Method m_no = clazz.getMethod("eat");
			m_no.invoke(p);
			//调用有参函数
			Method m_int = clazz.getMethod("eat", int.class);
			m_int.invoke(p, 10);
			System.out.println("=========调用函数============");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

}

输出

clazz====class com.ldw.bean.Person
Person [name=zhangsan, age=22]
=========有参构造============
clazz.getField('name')====public java.lang.String com.ldw.bean.Person.name
Person [name=lisi, age=22]
=========修改参数============
eat==没有参数===
eat==有参数===参数是===10
=========调用函数============

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值