验证中...
本周日(5月27日)码云企业技术分享会【微服务】专场将与你相约上海。阿里、华为、ThoughtWorks的技术大咖齐聚,等你来撩!
语言: Java
分类: 编程语言基础
最后更新于 2018-05-19 19:34
片段 1 片段 2 片段 3 片段 4 片段 5 片段 6
gistfile1.txt
原始数据 复制代码
package edu.taru.example;
/*反射的原因和优势和缺陷?
在编译是无法获得类的类型信息,只能在运行时获得。运行时动态获取类的信息以及动态的调用对象的方法称为java反射
优势:使程序具有动态性,变得灵活可扩展。
缺陷:代码增大,消耗一定性能。
*
*/
import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) {
try {
// 创建Class对象的三种方式
Class cl=Class.forName("edu.taru.example.Hero");
Class c2=Hero.class;
c2.isInterface();//实例化 new
Test t=new Test();
Class c3=t.getClass();
Method m[] =cl.getDeclaredMethods();//getDeclaredMethods()得到类的所有方法(不包含继承的方法);
Method m2[]=c2.getMethods();//getMethods()得到public和包含继承的方法;
Constructor m3[]=c3.getConstructors();//得到该类所有的公共的构造方法
//增强for循环冒号前的是对象
for(Method m1:m){
System.out.println(m1.getName());
}
} catch (ClassNotFoundException e) {
// TODO 自动生成 catch 块
e.printStackTrace();
}
}
}
class Hero{
public void study(){
}
}
2018-5-17 23-35-35.JPG
gistfile2.txt
原始数据 复制代码
package demo;
/*
* 题目:通过java多态实现,从配置文件中得到确定的某个之类然后运行子类特有的方法。
实现原理:通过java反射在运行期间调用类的信息及方法。
1现在game类的构造函数中,通过反射从配置文件中得到Class,并且对它进行实例化
2设置一个setName方法得到某个确定的实例(哪个子类)。
2在本类(game)中在得到Class 在进行遍历得到所有方法,然后通过invoke(调用方法) setName来确定给当前对象赋值
*
*
*/
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) {
Game g=new Game();
g.run();
}
}
class Hero{
public void kill(){
System.out.println("英雄在攻击");
}
}
class solider extends Hero
{
public void kill(){
System.out.println("战士在攻击");
}
}
class Master extends Hero
{
public void kill(){
System.out.println("法师在攻击");
}
}
class Game{
Hero hero;
public void setName(Hero hero){
this.hero=hero;
}
public Game(){
try {
BufferedReader bf=new BufferedReader(new FileReader("config.txt"));
String str=bf.readLine();
Class clazz= Class.forName(str);
Object obj= clazz.newInstance();
Method m[]= Game.class.getDeclaredMethods();//遍历本类的所有方法
for(Method d:m){
if(d.getName().equals("setName")){
d.invoke(this, obj);//调用setName却定哪个子类 Hero h=new solider();
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void run(){
hero.kill();
}
}
利用反射获取属性值,setAccessible(true)私有的也可以访问
原始数据 复制代码
package demo;
import java.lang.reflect.Field;
public class Test2 {
public static void main(String[] args) {
Field [] f=Tset1.class.getFields();
Tset1 t=new Tset1();
for(Field e:f){
e.setAccessible(true);
try {
e.set(t, 10);
} catch (IllegalArgumentException e1) {
// TODO 自动生成 catch 块
e1.printStackTrace();
} catch (IllegalAccessException e1) {
// TODO 自动生成 catch 块
e1.printStackTrace();
}
}
for(Field e:f){
try {
System.out.println(e.get(t));
} catch (Exception e1) {
// TODO 自动生成 catch 块
e1.printStackTrace();
// TODO 自动生成 catch 块
e1.printStackTrace();
}
}
}
}
gistfile3.txt
原始数据 复制代码
package demo;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
Test t=new Test();
User u=t.getData(User.class, "config.txt");
List<User> u2=t.getlistData(User.class, "config.txt");
for(User u3:u2){
System.out.println(u3);
}
//System.out.println(u);
}
public <T>T getData(Class<T> clazz,String file){
BufferedReader br=null;
Object object=null;
try {
br=new BufferedReader(new FileReader(new File(file)));
String str=br.readLine();
String []st1= str.split(",");
object=clazz.newInstance();
for(String str3:st1){
String []st2=str3.split("=");
String methodName="set"+st2[0].substring(0,1).toUpperCase()+st2[0].substring(1);
Method m=clazz.getDeclaredMethod(methodName, String.class);
m.invoke(object,st2[1]);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
if(br!=null){
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return (T) object;
}
public <T>List<T> getlistData(Class<T> clazz,String file){
List<T> list=new ArrayList<T>();
BufferedReader br=null;
Object object=null;
try {
br=new BufferedReader(new FileReader(new File(file)));
while(true){
String str=br.readLine();
if(str==null){
break;
}
String []st1= str.split(",");
object=clazz.newInstance();
list.add((T) object);
for(String str3:st1){
String []st2=str3.split("=");
String methodName="set"+st2[0].substring(0,1).toUpperCase()+st2[0].substring(1);
Method m=clazz.getDeclaredMethod(methodName, String.class);
m.invoke(object,st2[1]);
}
}
} catch (Exception e) {
e.printStackTrace();
}finally{
if(br!=null){
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return list;
}
}
class User{
String id;
String name;
String sex;
String telephone;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getTelephone() {
return telephone;
}
public void setTelephone(String telephone) {
this.telephone = telephone;
}
public String toString(){
return "id="+id+",name="+name+",sex="+sex+",telephone="+telephone;
}
}
无标,2.png

评论列表( 0 )

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

9_float_left_people 9_float_left_close