验证中...
10月20日,北京【人工智能】源创会火热报名中,点击报名收获 AI 训练指南
语言: Java
分类: 编程语言基础
最后更新于 2018-05-20 21:41
片段 1 片段 2 片段 3 片段 4 片段 5 片段 6 片段 7 片段 8 片段 9 片段 10
1、反射的基础知识
原始数据 复制代码
import java.lang.reflect.Method;
import taru.educate.Hero;
public class Test {
public static void main(String[] args) {
//通过类的名称
Class clazz=Hero.class;
//通过实例调用
Hero h=new Hero();
Class clazz2 =h.getClass();
//通过权限包类名(包+类名)
try {
Class clazz3=Class.forName("taru.educate.Hero");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//对于包装类
Class clazz4=Integer.TYPE;
Class clazz5=Boolean.TYPE;
//动态的获取方法的内容 无法得到继承的方法
Method[] Methods=clazz.getDeclaredMethods();
Method[] Method2=clazz.getMethods();//能得到继承的方法,但只能是公开的
for(Method m:Methods){
System.out.println(m.getName());
}
}
}
2、要从文件里配置那个类,那个类就在攻击,在某个盘配置一个文件,文件配置了一个具体的权限定类名
原始数据 复制代码
package educte.taru.example;
/**
* 1、反射的第一步类型信息
* 2、通过类型信息获得实例(newInstance)或者获得方法以及属性
* 3、调用方法(invoke),注意传递参数
*
* 反射的原因和优势
* 在编译时无法获取类型信息,只能在运行时获得场景,使用反射
* 利用反射技术,使得程序具有动态性,更加灵活可扩展
* 劣势:灵活的背后使得代码增多和成本增加,最终会消耗一定性能
*/
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.lang.reflect.Method;
public class Hero {
public void kill(){
}
public static void main(String[] args) {
Game g=new Game();
g.run();
}
}
class Master extends Hero{
public void kill(){
System.out.println("法师在攻击");
}
}
class Solder extends Hero{
public void kill(){
System.out.println("战士在攻击");
}
}
class Game{
Hero hero;
public void setHero(Hero hero){
this.hero=hero;
}
public Game(){
//要从文件里配置那个类,那个类就在攻击,在某个盘配置一个文件,文件配置了一个具体的权限定类名
try {
BufferedReader br=new BufferedReader(new FileReader("D://周顺利.txt"));
String className=br.readLine();
//获取一个子类Class
Class clazz=Class.forName(className);
Object Instance=clazz.newInstance();//实例化
Method [] methods=Game.class.getDeclaredMethods();
for(Method m:methods){
if(m.getName().equals("setHero")){
m.invoke(this, Instance);//this是Game.class
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void run(){
hero.kill();
}
}
3、获得类型信息
原始数据 复制代码
package educte.taru.example;
import java.lang.reflect.Field;
public class Test1 {
int i;
double k;
public static void main(String[] args) {
//获得类型信息
Field [] fi=Test1.class.getDeclaredFields();
for(Field f:fi){
System.out.println(f.getName());
}
}
}
4、给参数赋值
原始数据 复制代码
package educte.taru.example;
import java.lang.reflect.Field;
public class Test1 {
int i;
double k;
public static void main(String[] args) {
Test1 test=new Test1();
//获得类型信息
Field [] fi=Test1.class.getDeclaredFields();
for(Field f:fi){
try {
f.set(test, 100);//给参数赋值
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(test.i);
System.out.println(test.k);
}
}
}
5、是
原始数据 复制代码
package educte.taru.example;
import java.lang.reflect.Field;
public class Tset2 {
int i;
double k;
public static void main(String[] args) {
Test1 test=new Test1();
//获得类型信息
Field [] fi=Test1.class.getDeclaredFields();
for(Field f:fi){
try {
f.set(test, 100);//给参数赋值
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(test.i);
System.out.println(test.k);
}
}
}
新建 Microsoft Word 文档.docx
6、getDeclaredMethod和getMethod的区别
原始数据 复制代码
一、
1、Method getDeclaredMethod(String name, Class… parameterTypes)d
返回一个 Method 对象,该对象反映此 Class 对象所表示的类或接口的指定已声明方法。
2、Method[] getDeclaredMethods()
返回 Method 对象的一个数组,这些对象反映此 Class 对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。
二、
1、Method getMethod(String name, Class… parameterTypes)
返回一个 Method 对象,它反映此 Class 对象所表示的类或接口的指定公共成员方法。
2、Method[] getMethods()
返回一个包含某些 Method 对象的数组,这些对象反映此 Class 对象所表示的类或接口(包括那些由该类或接口声明的以及从超类和超接口继承的那些的类或接口)的公共 member 方法。
7、反射实例
原始数据 复制代码
package educate.tura.example;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) {
Test test=new Test();
User user=test.getData(User.class, "D:\\user.txt");
//Hero hero=test.getData(Hero.class, "D:\\user.txt");
System.out.println(user);
}
/**
* 构造一个通用的方法,能够实现把文件中的对象换成实体对象
* @param clazz
* @param file
* @return
*/
public <T>T getData(Class <T>clazz,String file){ //Class <T>clazz第一个参数是类的对象 第二个是传一个文件
BufferedReader br=null;
Object object=null;
try {
br = new BufferedReader(new FileReader(new File(file)));//从文件里读取(id=10,name=张三,sex=男,telphone=18196362130,age=22)
String str=br.readLine();
String [] s1=str.split(",");//分割文件里的属性(id=10 name=张三 sex=男 telphone=18196362130 age=22)
object =clazz.newInstance();//如果没有无参数的构造函数,要用构造方法
for(String s2:s1){
String[] s3=s2.split("=");//按等号分割(id 10 name 张三 sex 男 telphone 18196362130 age 22);
String methodName="set"+s3[0].substring(0,1).toUpperCase()+s3[0].substring(1); //setName setId setAge
Method m=clazz.getDeclaredMethod(methodName ,String.class);
m.invoke(object, s3[1]);//setName("张三")
//m.invoke(newInstance(), s3[1]);//setName("张三")
}
} catch (Exception e) {
e.printStackTrace();
}finally{
if(br!=null){
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return (T)object;
}
}
class User{
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", sex=" + sex
+ ", telhone=" + telphone + ", age=" + age + "]";
}
String id;
String name;
String sex;
String telphone;
String age;
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 getTelphone() {
return telphone;
}
public void setTelphone(String telphone) {
this.telphone = telphone;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
class Hero{
}
8、获取Class对象的三种方式
原始数据 复制代码
<span style="font-size:18px;">package fanshe;
/**
* 获取Class对象的三种方式
* 1 Object ——> getClass();
* 2 任何数据类型(包括基本数据类型)都有一个“静态”的class属性
* 3 通过Class类的静态方法:forName(String className)(常用)
*
*/
public class Fanshe {
public static void main(String[] args) {
//第一种方式获取Class对象
Student stu1 = new Student();//这一new 产生一个Student对象,一个Class对象。
Class stuClass = stu1.getClass();//获取Class对象
System.out.println(stuClass.getName());
//第二种方式获取Class对象
Class stuClass2 = Student.class;
System.out.println(stuClass == stuClass2);//判断第一种方式获取的Class对象和第二种方式获取的是否是同一个
//第三种方式获取Class对象
try {
Class stuClass3 = Class.forName("fanshe.Student");//注意此字符串必须是真实路径,就是带包名的类路径,包名.类名
System.out.println(stuClass3 == stuClass2);//判断三种方式是否获取的是同一个Class对象
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
}</span>
9、获取成员变量并调用
原始数据 复制代码
import java.lang.reflect.Field;
<span style="font-size:14px;">package fanshe.method;
public class Student {
//**************成员方法***************//
public void show1(String s){
System.out.println("调用了:公有的,String参数的show1(): s = " + s);
}
protected void show2(){
System.out.println("调用了:受保护的,无参的show2()");
}
void show3(){
System.out.println("调用了:默认的,无参的show3()");
}
private String show4(int age){
System.out.println("调用了,私有的,并且有返回值的,int参数的show4(): age = " + age);
return "abcd";
}
}
</span>
/*
* 获取成员变量并调用:
*
* 1.批量的
* 1).Field[] getFields():获取所有的"公有字段"
* 2).Field[] getDeclaredFields():获取所有字段,包括:私有、受保护、默认、公有;
* 2.获取单个的:
* 1).public Field getField(String fieldName):获取某个"公有的"字段;
* 2).public Field getDeclaredField(String fieldName):获取某个字段(可以是私有的)
*
* 设置字段的值:
* Field --> public void set(Object obj,Object value):
* 参数说明:
* 1.obj:要设置的字段所在的对象;
* 2.value:要为字段设置的值;
*
*/
public class Fields {
public static void main(String[] args) throws Exception {
//1.获取Class对象
Class stuClass = Class.forName("fanshe.field.Student");
//2.获取字段
System.out.println("************获取所有公有的字段********************");
Field[] fieldArray = stuClass.getFields();
for(Field f : fieldArray){
System.out.println(f);
}
System.out.println("************获取所有的字段(包括私有、受保护、默认的)********************");
fieldArray = stuClass.getDeclaredFields();
for(Field f : fieldArray){
System.out.println(f);
}
System.out.println("*************获取公有字段**并调用***********************************");
Field f = stuClass.getField("name");
System.out.println(f);
//获取一个对象
Object obj = stuClass.getConstructor().newInstance();//产生Student对象--》Student stu = new Student();
//为字段设置值
f.set(obj, "刘德华");//为Student对象中的name属性赋值--》stu.name = "刘德华"
//验证
Student stu = (Student)obj;
System.out.println("验证姓名:" + stu.name);
System.out.println("**************获取私有字段****并调用********************************");
f = stuClass.getDeclaredField("phoneNum");
System.out.println(f);
f.setAccessible(true);//暴力反射,解除私有限定
f.set(obj, "18888889999");
System.out.println("验证电话:" + stu);
}
}</span><span style="font-size:18px;">
</span>

评论列表( 0 )

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

搜索帮助