验证中...
本周日(5月27日)码云企业技术分享会【微服务】专场将与你相约上海。阿里、华为、ThoughtWorks的技术大咖齐聚,等你来撩!
语言: Java
分类: 编程语言基础
最后更新于 2018-05-19 00:40
片段 1 片段 2 片段 3 片段 4
利用反射获取方法
原始数据 复制代码
package L1;
import java.lang.reflect.Method;
import L2.Hero;
/**
* 反射机制
* 包装类有四种方法;
* 其他类有三种方法
* @author k66
*
*/
public class Test {
public static void main(String[] args) {
//1、通过类的名称
Class s1=Hero.class;
//2、通过实例获取
Hero h=new Hero();
Class s2=h.getClass();
//3、通过全限定类名(包名+类名)
try {
Class s3=Class.forName("L2.Hero");
//实例化 new
try {
Object instance=s3.newInstance();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//4、对于包装类
Class s4=Integer.TYPE;
Class s5=Double.TYPE;
//动态获取方法内容 无法得到继承的方法
Method[] methods=s1.getDeclaredMethods();
//能得到继承,但只是公开的方法
for(Method m:methods){
System.out.println(m.getName()+m.toString());
}
}
}
反射案例
原始数据 复制代码
package L1;
import java.io.BufferedReader;
import java.io.FileReader;
import java.lang.reflect.Method;
/**
*
* 反射优点:在编译时无法获取类型信息,只能在运行时获得场景,使用反射技术,使得程序具有动态性,更加灵活;
* 反射缺点:代码多,成本高,消耗一定的性能;
* @author k66
*
* 反射案例
*
*/
public class Test {
public static void main(String[] args) {
Game g = new Game();
g.run();
}
}
class Hero {
void kill() {
}
}
class Master extends Hero {
void kill() {
System.out.println("法师在攻击");
}
}
class Solder extends Hero {
void kill() {
System.out.println("战士在攻击");
}
}
class Game {
Hero hero;
public Game() {
BufferedReader br=null;
try {
br = new BufferedReader(new FileReader(
"E:\\game.txt"));
String str = br.readLine();
Class clazz = Class.forName(str);
Object obj = clazz.newInstance();
Method[] ms = Game.class.getDeclaredMethods();
for (Method m : ms) {
if (m.getName().endsWith("setHero")) {
m.invoke(this, obj);
}
}
} catch (Exception e) {
e.printStackTrace();
}finally{
if(br!=null){
}
}
}
public void setHero(Hero hero) {
this.hero = hero;
}
void run(){
hero.kill();
}
}
利用反射获取属性(同包)
原始数据 复制代码
package L1;
import java.lang.reflect.Field;
public class Test1 {
private int i;
public int k;
public static void main(String[] args) {
Field []fs=Test1.class.getFields();
Test1 t=new Test1();
for(Field f:fs){
try {
//设置字段
//f.setAccessible(true);
f.set(t, 1000);
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println(t.i);
}
}
利用反射获取属性(异包)
原始数据 复制代码
package L1;
import java.lang.reflect.Field;
import edu.taru.office.Test;
public class Test1 {
public static void main(String[] args) {
Field []fs=Test.class.getDeclaredFields();
Test t=new Test();
for(Field f:fs) {
try {
//设置字段可以暴力访问私有属性(private)
f.setAccessible(true);
f.set(t, 1100);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
System.out.println(t.k);
for(Field f:fs) {
try {
System.out.println(f.get(t));
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}

评论列表( 0 )

你可以在登录后,发表评论

9_float_left_people 9_float_left_close