大家好,乐字节小乐继续为Java初学者讲述Java基础知识。上次说到乐字节Java反射之三:方法、数组、类加载器,这次是Java反射之四:反射相关操作

1、操作属性

                    //1、获取Class对象
Class<?> clz=Class.forName("com.shsxt.ref.simple.User");
//2、获取对象
User u=(User)clz.newInstance();
//3、设置属性
Field field=clz.getDeclaredField("uname");
field.setAccessible(true);//打开权限
field.set(u, "0523");
//4、获取此属性
System.out.println(field.get(u));

2、调用方法

调用方法,都是直接对象.方法([实参]);反射之后,动态调用方法需要使用 invoke即可。

1)、方法调用

                //1、获取Class对象
Class<?> clz=Class.forName("com.shsxt.ref.simple.User");
//2、获取对象
User u=(User)clz.newInstance();
//3、获取方法
Method m =clz.getMethod("coding", String.class,String.class);
//4、成员方法的调用
m.invoke(u, "反射","多个参数");
//若是静态方法,传递null即可 因为静态方法属性类,不属于对象
m=clz.getMethod("testStatic",int.class);
m.invoke(null, 100);//与对象无关

2)、操作setter与getter访问器

/**
* @param obj 操作的对象
* @param att 操作的属性
* @param value 设置的值
* */
public static void setter(Object obj, String att,Object value) {
try {
//setUname setUpwd -->第一个字母大写
att=att.substring(0,1).toUpperCase()+att.substring(1);
Method method = obj.getClass().getMethod("set" + att, value.getClass());
method.invoke(obj, value);
} catch (Exception e) {
e.printStackTrace();
}
}
public static Object getter(Object obj, String att) {
try {
//getUname getUpwd -->第一个字母大写
att=att.substring(0,1).toUpperCase()+att.substring(1);
Method method = obj.getClass().getMethod("get" + att);
return method.invoke(obj);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
main方法
//1、获取Class对象
Class<?> clz=Class.forName("com.shsxt.ref.simple.User");
//2、获取对象
User u=(User)clz.newInstance();
//3、设置值
setter(u,"uname","shsxt");
//获取值
String str=(String) getter(u,"uname");
System.out.println(str);

3、利用反射编写简单工厂设计模式

利用反射+配置文件可以实现简单工厂模式。

interface  Car{
void run();
}
class Bmw implements Car{
public void run(){
System.out.println("小样,学的怎么样");
}
}
class QQ implements Car{
public void run(){
System.out.println("大哥,救我");
}
}
class Benz implements Car{
public void run(){
System.out.println("哈哈");
}
}
//简单工厂
class CarFactory{
public static Car product2(String carStr){
if(carStr.equals("qq")){
return new QQ();
}else if(carStr.equals("benz")){
return new Benz();
}
//如有其它车辆,需要添加代码
return null;
}
/**
* 根据字符串 创建对象
* @param carStr
* @return
*/
public static Car product(String carStr){
try {
return (Car)Class.forName(carStr).newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
}
#car.properties
qq=com.shsxt.ref.simplefactory.QQ
benz=com.shsxt.ref. simplefactory.Benz
bmw=com.shsxt.ref. simplefactory.Bmw
public static void main(String[] args) throws Exception {
//加载配置文件
Properties pro =new Properties();
pro.load(Thread.currentThread().getContextClassLoader().getResourceAsStream("car.properties"));
//获取对应的 完整路径(报名.类名)
String clz =pro.getProperty("qq");
CarFactory.product(clz).run();
}

Java反射相关知识就讲到这里了,下次我们进入到JavaSE的课程:循环控制

请继续关注乐字节,Java知识技术分享,乐字节原创

乐字节Java反射之四:反射相关操作的更多相关文章

  1. 乐字节Java反射之三:方法、数组、类加载器和类的生命周期

    本文承接上一篇:乐字节Java发射之二:实例化对象.接口与父类.修饰符和属性 继续讲述Java反射之三:方法.数组.类加载器 一.方法 获取所有方法(包括父类或接口),使用Method即可. publ ...

  2. 乐字节Java反射之二:实例化对象、接口与父类、修饰符和属性

    大家好,小乐继续接着上集:乐字节Java反射之一:反射概念与获取反射源头Class 这次是之二:实例化对象.接口与父类.修饰符和属性 一:实例化对象 之前我们讲解过创建对象的方式,有new .克隆.反 ...

  3. 乐字节Java反射之一:反射概念与获取反射源头class

    一.Java反射机制概念 “程序运行时,允许改变程序结构或变量类型,这种语言称为动态语言”,如Python, Ruby是动态语言:显然C++,Java,C#不是动态语言,但是JAVA有着一个非常突出 ...

  4. 乐字节Java|GC垃圾回收机制、package和import

    本文接上一篇:乐字节Java|this关键字.static关键字.block块.本文是接着讲述JavaGC垃圾回收机制.package 和 import语句. 一.GC垃圾回收机制 GC全名:Garb ...

  5. 乐字节Java|封装JavaBean、继承与权限修饰

    本文继续讲Java封装.上一篇:乐字节Java|GC垃圾回收机制.package和import语句 这次讲述JavaBean.继承与权限修饰 一. 封装javaBean 封装(Encapsulatio ...

  6. 乐字节Java编程语言发展,面向对象和类

    大家好,上次我们讲过了乐字节Java编程之方法.调用.重载.递归,接下来我们将会进入到Java封装的内容.Java编程语言发展,面向对象和类. 一.编程语言的发展 机器语言——直接由计算机的指令组成, ...

  7. java 线程 原子类相关操作演示样例 thinking in java4 文件夹21.3.4

    java 线程  原子类相关操作演示样例 package org.rui.thread.volatiles; import java.util.Timer; import java.util.Time ...

  8. 乐字节Java继承|方法重写、super和final关键字

    大家好,乐字节的小乐又来了,上一篇是:乐字节Java|JavaBean.继承与权限修饰,也是属于Java继承的,今天继续Java继承. 一. 方法的重写 父类不满足子类的要求,按需改写.注意 方法签名 ...

  9. 乐字节Java变量与数据结构之二:Java常量与变量

    大家好,小乐又来给大家讲述Java基础知识.上次说了乐字节Java变量与数据类型之一:Java编程规范,关键字与标识符,这次将接着往下说,谈谈Java常量与变量. 1.常量 1).定义 在程序执行的过 ...

随机推荐

  1. Crontab 定时任务格式参数

    crontab 定时执行 任务 格式: * * * * *-) 小时(-) 日(-) 月份(-) 星期(-6) 星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条 ...

  2. P/NP问题

    目录 P NP NPC NPH 写在开头 1.多项式 如公式:y = axn-bxn-1+c.Ο(log2n).Ο(n). Ο(nlog2n).Ο(n2)和Ο(n3)称为多项式时间.Ο(2n)和Ο(n ...

  3. 【原创】go语言学习(十四)IO操作1

    目录: 格式化输入 格式化输出 终端输入输出背后的原理理 bufio包的使用 命令行参数处理理和urfave/cli使用 格式化输入 1.从终端获取⽤用户的输入 格式化输入 fmt.Scan(a …i ...

  4. mutex,thread(c++11 windows linux三种方式)

    一 c++11  windows linux三种方式 //#include <stdio.h> //#include <stdlib.h> //#include <uni ...

  5. codeforces37C

    CF37C Old Berland Language   sol:直接暴力模拟下去,长度加了就补0,凑个数就+1,凑不好就puts(“no”) #include <bits/stdc++.h&g ...

  6. 前端逼死强迫症之DOM

    Dom:document.相当于把所有的html文件,转换成了文档对象. 之前说过:html-裸体的人:css-穿上衣服:js-让人动起来. 让人动起来,就得先找到他,再修改它内容或属性. 找到标签 ...

  7. EXTJS框架-入门实例

    extjs框架是一个JavaScript框架,可以渲染出丰富的控件 实例: 代码: <html> <head> <title>test</title> ...

  8. python3编程基础之一:程序结构

    程序从程序入口进入,到程序执行结束,大体是按照顺序结构执行语句.函数或代码块,掌握程序的结构,有利于把握程序的主体框架. 1.顺序结构--最常见的结构 顺序结构的程序设计是最简单的,只要按照解决问题的 ...

  9. nginx做反向代理时出现302错误

    现象:nginx在使用非80端口做反向代理时,浏览器访问发现返回302错误 详细现象如下: 浏览器请求登录页: 输入账号密码点击登录: 很明显登录后跳转的地址少了端口号. 原因:proxy.conf文 ...

  10. 8. String to Integer (atoi) ---Leetcode

    Implement atoi to convert a string to an integer. 题目分析: 题目本身很简单就是将一个字符串转化成一个整数,但是由于字符串的千差万别,导致在实现的时候 ...