反射概述
* 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
=========调用函数============