欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

类的反射_reflex

程序员文章站 2022-07-02 14:10:00
JAVA反射机制 JAVA反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。 JAVA反射(放射)机制:“程序运行时,允许改变程序结构或变量类型,这种语言 ......

java反射机制

java反射机制是在运行状态中,对于任意一个实体类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
java反射(放射)机制:“程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”。从这个观点看,perl,python,ruby是动态语言,c++,java,c#不是动态语言。但是java有着一个非常突出的动态相关机制:reflection,用在java身上指的是我们可以于运行时加载、探知、使用编译期间完全未知的classes。换句话说,java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),并生成其对象实体、或对其fields设值、或唤起其methods。
 

功能

java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
 
代码演示

package com.svse.reflex;

import java.io.ioexception;
import java.io.inputstream;
import java.lang.reflect.field;
import java.lang.reflect.method;
import java.util.properties;
import org.junit.test;
/***
* 类的反射
* @author administrator
* java反射机制提供的功能
* 在运行时:
* <1>判断任意一个对象所属的类
* <2>构造任意一个类的对象
* <3>判断任意一个类所具有的成员变量和方法
* <4>调用任意一个对象的成员变量和方法
* <5>生成动态代理
*/
public class classreflex {

//关于类的加载器classloader
@test
public void test5() throws classnotfoundexception, ioexception{
classloader classloader=classloader.getsystemclassloader();
system.out.println(classloader);

classloader classloader1=classloader.getparent();
system.out.println(classloader1);

classloader classloader2=classloader1.getparent();
system.out.println(classloader2);

class clazz=person.class;
classloader classloader3=clazz.getclassloader();
system.out.println(classloader3);

string forname="java.lang.string";
class clazz2=class.forname(forname);
classloader classloader4=clazz2.getclassloader();
system.out.println(classloader4);

classloader classloader5=this.getclass().getclassloader();
inputstream is=classloader5.getresourceasstream("com\\svse\\reflex\\db.properties");//读取properties文件信息
properties properties=new properties();
properties.load(is);
string name=properties.getproperty("name");
string password=properties.getproperty("password");
system.out.println(name+" : "+password);

}

/***
* 获取class实例的三种方式
* @throws classnotfoundexception
*/
@test
public void test4() throws classnotfoundexception{
//1:调用运行时类本身的class属性
class clazz=person.class;
system.out.println(clazz.getname());
class clazz2=string.class;
system.out.println(clazz2.getname());
//2:通过运行时类的对象获取
person p=new person();
class clazz3=p.getclass();
system.out.println(clazz3.getname());
//3:通过class的静态方法获取 (体会一下反射的动态性)
string forname="com.svse.reflex.person";
class clazz4=class.forname(forname);
system.out.println(clazz.getname());

//4:了解类的加载器classloader
classloader classloader=this.getclass().getclassloader();
class clazz5=classloader.loadclass(forname);
system.out.println(clazz5.getname());

system.out.println(clazz==clazz2);
system.out.println(clazz==clazz3);
system.out.println(clazz==clazz4);
system.out.println(clazz==clazz5);

}


/**
* java.lang.class 是反射的源头
* 通过运行时类的getclass()方法创建实例
*/
@test
public void test3(){
person p=new person();
class clazz=p.getclass();//通过运行时类的对象,调用其getclass()方法,返回其运行时类
system.out.println(clazz);
}



//有了反射之后,可以通过反射创建一个类的对象,并调用其中的属性和方法
@test
public void test2() throws exception{
class clazz=person.class;
//1创建clazz对应的运行时类person的对象
person p=(person) clazz.newinstance();
system.out.println(p);

//2 通过反射调用类的属性
field f1=clazz.getfield("name");
f1.set(p, "王小米");
system.out.println(p);
//field f2=clazz.getfield("age");
field f2=clazz.getdeclaredfield("age");//如果属性设置为private
f2.setaccessible(true);//必须设置允许访问为true,否则就获取不到私有属性的值
f2.set(p, 26);
system.out.println(p);
//3 通过反射调用类的方法
method m1=clazz.getmethod("show");
m1.invoke(p);
method m2=clazz.getmethod("display",string.class);
m2.invoke(p,"china");
//4

}

//在有反射前,传统的方法,如何创建一个类的对象,并调用其中的属性和方法
@test
public void test1(){
person p=new person();
p.setage(25);
p.setname("张三");
system.out.println(p);
p.show();
p.display("china");
}

}

 

db.properties文件

name=zhangsan
password=123456

 

person.java文件

package com.svse.reflex;

public class person {

public string name;
private int age;

public person() {
super();
}

public person(string name) {
super();
this.name = name;
}

public person(string name, int age) {
super();
this.name = name;
this.age = age;
}

public void add(string name){
system.out.println("公有的---"+name);
}

private void find(string name){
system.out.println("私有的---"+name);
}

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

public void show(){
system.out.println("我是一个man");
}
public void display(string nation){
system.out.println("我的国籍是:"+nation);
}

@override
public string tostring() {
return "person [name=" + name + ", age=" + age + "]";
}

}