java反射(1)

反射的三个阶段

三种方式

* 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§;

} 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 + “]”;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值