验证中...
10月20日,北京【人工智能】源创会火热报名中,点击报名收获 AI 训练指南
语言: Java
分类: 编程语言基础
最后更新于 2018-05-19 14:00
片段 1 片段 2 片段 3
概念
原始数据 复制代码
package study;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
/**
* 反射
* 反射是运行时,动态获取类的类型信息(在运行时得到类有哪些方法,类有哪些属性)的一种动态技术,或者是动态机制。
* 是Java中的一种高级技术。Java原本是一个强类型,静态的语言(编译时),有反射之后,编程动态语言。
* 反射的第一步:获得类型信息
* 1.通过类的名称得到类型信息
* Class CA=A.class;
* 2.通过实例获取
* A a=new A();
* Class CA2=a.getClass();
* 3.通过全限定类名(包名+类名)获得
* Class CA3=Class.forName("ldm.eg.A");
* 4.对于包装类
* Class CA4=Integer.TYPE;
* Class CA42=Boolean.TYPE;
* getDeclaredMethods()获得类的方法
* 反射的第二步:通过类型信息获得实例,或者获得方法(newInstance)以及属性
* 反射的第三步:调用方法(invoke),注意传递参数
*
* 反射的原因和优势以及劣势?
* 【原因】在编译时无法获取类型信息,只能在运行时获得的场景,使用反射。
* 【优势】利用反射技术,使得程序具有动态性,更加灵活可扩展。
* 【劣势】灵活的背后,是代码增多,成本增加,最终会消耗一定的性能。
* 利用反射调用属性:
* 1.setAccessible(true);设置属性字段权限 可访问,如果此属性的访问修饰符是 private 此方法可以暴力破解
* 2.set(对象,值) 设置值
* 3.get(对象) 取值
*
*/
public class Test {
//强类型
private int i=1;
public double d=100.00;
//弱类型
//var i=100;
public static void main(String[] args) {
/*
* 获得类型信息
*/
//1.
Class CA=A.class;
//2.
A a=new A();
Class CA2=a.getClass();
//3.
Class CA3=null;
try {
CA3=Class.forName("study.A");
try {
Object instance=CA3.newInstance();//实例化 new 会在堆区创建对象
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//4.
Class CA4=Integer.TYPE;
Class CA42=Boolean.TYPE;
/*
* 动态的获取方法内容 无法得到继承的方法
*/
//1.
Method [] method=CA.getDeclaredMethods();
Method [] methods=CA.getMethods();//能得到继承,但是只能公开的方法
for(Method m:method){
System.out.println("CA类中的方法有:"+m.getName());
}
//2.
Method [] method2=CA2.getDeclaredMethods();
for(Method m:method){
System.out.println("CA2类中的方法有:"+m.getName());
}
//3.
Method [] method3=CA3.getDeclaredMethods();
for(Method m:method){
System.out.println("CA3类中的方法有:"+m.getName());
}
//4.
Method [] method4=CA4.getDeclaredMethods();
for(Method m:method){
System.out.println("CA4类中的方法有:"+m.getName());
}
/*
* 获得类型信息 通过反射去赋值
*/
Field [] fs=Test.class.getDeclaredFields();
Test test=new Test();
for(Field f:fs){
try {
f.setAccessible(true);//设置字段 可以访问(主要针对私有属性)
f.set(test, 255);
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
for(Field f:fs){
try {
System.out.println(f.get(test));
} catch (IllegalArgumentException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
}
}
}
作业
原始数据 复制代码
package study;
import java.io.BufferedReader;
import java.io.FileReader;
import java.lang.reflect.Method;
/**
* 假设Hero是英雄类,为了程序可扩展,引入反射
*/
public class Hero {
public static void main(String[] args) {
Game g=new Game();
g.run();
}
void kill(){
}
}
/*
* 战士类
*/
class Warrior extends Hero{
void kill(){
System.out.println("战士在攻击!");
}
}
/*
* 法师类
*/
class Master extends Hero{
void kill(){
System.out.println("法师在攻击!");
}
}
/*
* 游戏类
*/
class Game{
Hero hero;//不知道是呢个英雄
public void setHero(Hero hero){
this.hero=hero;
}
public Game(){
//要求,配置文件中配置哪个类,就是哪个类在攻击,在某盘中有一个配置文件,叫game.ini 这个文件中配置了一个具体英雄的全限定类名。
//1.读取配置文件
//2.实例化
//3.给hero赋值 ()
try {
BufferedReader br=new BufferedReader(new FileReader("D:\\Hero.txt"));
String className=br.readLine();
Class H=Class.forName(className);
Object instance=H.newInstance();//得到一个实例
Method [] method=Game.class.getDeclaredMethods();
for(Method m:method){
if(m.getName().equals("setHero")){
m.invoke(this, instance);//为什么要通过反射获得方法
}
}
} catch (Exception e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
}
public void run(){
hero.kill();
}
}
反射的应用
原始数据 复制代码
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
Test test = new Test();
List<User> user = test.getUsers(User.class,"D://User.txt");
for(User u:user){
String ID = u.getID();
String Age = u.getAge();
String Name = u.getName();
String Sex = u.getSex();
String CallPhone = u.getCallPhone();
System.out.println("ID:"+ID+" 年龄:"+Age+" 姓名:"+Name+" 性别:"+Sex+" 联系方式:"+CallPhone);
}
}
public<T>List<T> getUsers(Class<T> C,String file){
//创建一个动态数组 把用户信息存放在数组里
List lists=new ArrayList<User>();
//创建一个缓冲字符输入流
BufferedReader br=null;
Object newC=null;
try {
//用缓冲字符流读取 配置文件信息
br=new BufferedReader(new FileReader(file));
while(true){
String information=br.readLine();
if(information==null){
break;
}
newC=C.newInstance();
lists.add(newC);
String [] I=information.split(",");
for(String s:I){
String [] Is=s.split("=");
String getmethod=new String("set"+Is[0].substring(0,1).toUpperCase()+Is[0].substring(1));
Method method = User.class.getDeclaredMethod(getmethod,String.class);
method.invoke(newC, Is[1]);
}
}
} catch (Exception e) {
System.out.println("读取文件错误!");
e.printStackTrace();
} finally{
if(br!=null){
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return lists;
}
}
/*
* 用户信息
*/
class User{
String ID;
String Name;
String Sex;
String Age;
String CallPhone;
public String getAge() {
return Age;
}
public void setAge(String age) {
Age = age;
}
public String getCallPhone() {
return CallPhone;
}
public void setCallPhone(String callPhone) {
CallPhone = callPhone;
}
public String getID() {
return ID;
}
public void setID(String id) {
ID = id;
}
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
public String getSex() {
return Sex;
}
public void setSex(String sex) {
Sex = sex;
}
}

评论列表( 0 )

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

搜索帮助