类的反射_reflex
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 + "]";
}
}
上一篇: Spring Cloud 微服务中搭建 OAuth2.0 认证授权服务
下一篇: 单向链表增删查