Java 反射(简单捋一下)
package cn.classes; public class OneClass { }
import cn.classes.OneClass; public class Test {
public static void main(String[] args) {
Class<?> c1 = null;
Class<?> c2 = null;
Class<?> c3 = null; try{
// 方法一:forName
c1 = Class.forName("cn.classes.OneClass");
}
catch (ClassNotFoundException e){
e.printStackTrace();
}
// 方法二
c2 = new OneClass().getClass(); // 方法三
c3 = OneClass.class; System.out.println(c1.getName());
System.out.println(c2.getName());
System.out.println(c3.getName());
}
} 输出结果:cn.classes.OneClass
利用Class这个类实例化类
无参构造
package cn.classes; public class Person {
private String name;
private int age; // 省略getter setter @Override
public String toString(){
return "Person [name=" + name + ", age=" + age + "]";
} } package cn.test; import cn.classes.Person; public class Test{
// 这样做必须在类中有一个空构造方法
public static void main(String[] args){
Class<?> c = null;
try{
c = Class.forName("cn.classes.Person");
Person p = (Person)c.newInstance();
p.setName("xy");
p.setAge(20);
System.out.println(p);
}
catch (Exception e){
e.printStackTrace();
}
}
}
有参构造
package cn.classes; public class Person{
private String name;
private int age; public Person(Stringname,int age){ this.name = name; this.age = age; } // 省略getter setter @Override
public String toString(){
return "Person [name=" + name + ", age=" + age + "]";
}
} package cn.test; import java.lang.reflect.Constructor; import cn.classes.Person; public class Test{
// 若没有一个空构造方法
public static void main(String[] args) {
Class<?> c = null;
try {
c = Class.forName("cn.classes.Person");
Constructor<?> con = c.getConstructors(String.class,int.class);
Person p = (Person)con.newInstance("xy",20);
System.out.println(p);
}
catch (Exception e){
e.printStackTrace();
}
}
}
Class类调用方法
demo1:
package cn.classes; public class Person{
public void add(){
System.out.println("add");
} public void addWithParameters(String name, int age){
System.out.println("add带参数方法" + name + age);
}
} package cn.test; import java.lang.reflect.Method; public class Test{
public static void main(String[] args){
Class<?> c1 = null;
try{ c1 = Class.forName("cn.classes.Person"); // 不带参数的方法调用
Method m = c1.getMethod("add");
m.invoke(c1.newInstance()); // 带参数方法调用
Method m1 = c1.getMethod("addWithParameters", String.class, int.class);
m1.invoke(c1.newInstance(), "xy", 22);
}
catch (Exception e){
e.printStackTrace();
}
}
}
demo2:
package cn.classes;
public class Person{
private String name;
private int age;
// 省略getter setter
}
package cn.test;
import java.lang.reflect.Method;
public class Test{
public static void main(String[] args){
Class<?> c1 = null;
Object obj = null;
try{
c1 = Class.forName("cn.classes.Person");
obj = c1.newInstance();
setter(obj, "name", "xy", String.class);
setter(obj, "age", 20, int.class);
getter(obj, "name");
getter(obj, "age");
}
catch (Exception e){
e.printStackTrace();
}
}
/**
* @param obj:要操作的对象
* @param att:要操作的属性
* @param value:要设置的属性内容
* @param type:要设置的属性类型
*/
public static void setter(Object obj, String att, Object value, Class<?> type){
try{
// 得到setter方法
Method m = obj.getClass().getMethod("set" + initStr(att), type);
m.invoke(obj, value);
}
catch (Exception e){
e.printStackTrace();
}
}
/**
* @param obj:要操作的对象
* @param att:要操作的属性
*/
public static void getter(Object obj, String att){
try{
// 得到getter方法
Method m = obj.getClass().getMethod("get" + initStr(att));
System.out.println(m.invoke(obj));
}
catch (Exception e){
e.printStackTrace();
}
}
/**
* 首字母大写
* @param oldStr
* @return
*/ public static String initStr(String oldStr) { String newStr = oldStr.substring(0, 1).toUpperCase() + oldStr.substring(1); return newStr; } }
Java 反射(简单捋一下)的更多相关文章
- Java反射-简单应用
为了程序更好的维护和扩展,在面向对象思维的世界里,首先是面向接口编程,然后我们应该把做什么和怎么做进行分离. 以下我将用一个开晚会的样例来演示一下,终于达到的效果是:工厂+反射+配置文件实现程序的灵活 ...
- Java反射+简单工厂模式总结
除了 new 之外的创建对象的方法 通过 new 创建对象,会使得程序面向实现编程,先举个例子,某个果园里现在有两种水果,一种是苹果,一种是香蕉,有客户想采摘园子里的水果,要求用get()方法表示即可 ...
- Java反射 - 简单的给Bean赋值和取值
由于项目的实际需要,所以利用java反射原理写了一个简单给bean赋值和取值通用的类,在此记录下方便自己日后用到,也为需要的兄弟提供个参考例子. 工具类BeanRefUtil: package c ...
- Java反射简单使用--第一次细致阅读底层代码
1:所写的东西都经过验证,保证正确,环境jdk8,eclipse2:在例子中,尽量以生产环境中实际代码为例,那种固定值什么的没什么意义 问题: 1:想获取调用方法所需要的参数 2:参数是以json形式 ...
- java反射简单实例
这篇博友的总结的反射知识点是比较全面的 http://www.cnblogs.com/rollenholt/archive/2011/09/02/2163758.html 下面介绍我用反射做的两个功能 ...
- java反射机制简单实例
目录 Java反射 简单实例 @(目录) Java反射 Java语言允许通过程序化的方式间接对Class进行操作.Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通 ...
- java反射机制的简单介绍
参考博客: https://blog.csdn.net/mlc1218559742/article/details/52754310 先给出反射机制中常用的几个方法: Class.forName (& ...
- java反射并不是什么高深技术,面向对象语言都有这个功能,而且功能也很简单,就是利用jvm动态加载时生成的class对象
java反射并不是什么高深技术,面向对象语言都有这个功能. 面向对象语言都有这个功能,而且功能也很简单,就是利用jvm动态加载时生成的class对象,去获取类相关的信息 2.利用java反射可以调用类 ...
- Java反射(六)纯面向接口编程的简单框架实践
我们知道在使用MyBatis开发时,只需要添加DAO接口和对应的映射XML文件,不需要写DAO的实现类,其实底层是通过动态代理实现. 本文将使用前几篇文章的知识点实现一个纯面向接口编程的简单框架,与M ...
随机推荐
- [c/c++] programming之路(2)、kill QQ,弹出系统对话框,吃内存等
一.删除文件 二.盗取密码的原理 #include<stdlib.h> //杀掉QQ,然后提示网络故障,请重新登陆,弹出高仿界面,获取账号密码,然后打开QQ进行登录 void main() ...
- windows安装 php-redis redis 扩展
1.查看phpinfo(),确定要下载的扩展版本,扩展的下载地址在:https://pecl.php.net/package/redis 上图对应是是以下版本 2.把下载包里的文件放到php的ext文 ...
- bzoj 3489 A simple rmq problem - 线段树
Description 因为是OJ上的题,就简单点好了.给出一个长度为n的序列,给出M个询问:在[l,r]之间找到一个在这个区间里只出现过一次的数,并且要求找的这个数尽可能大.如果找不到这样的数,则直 ...
- 图片处理工具类 util
PathUtil package util; public class PathUtil { private static String seperator = System.getProperty( ...
- Global.asax.cs中相关方法
protected void Session_Start(object sender, EventArgs e) { #if DEBUG //debug 登陆默认设置 #endif } protect ...
- 使用 node 创建代码服务器
var express = require('express'); var proxy = require('http-proxy-middleware'); var app = express(); ...
- Git 提交的正确姿势:Commit message 编写指南
http://www.ruanyifeng.com/blog/2016/01/commit_message_change_log.html Git 每次提交代码,都要写 Commit message( ...
- Codeforces Round #271 (Div. 2) F. Ant colony 线段树
F. Ant colony time limit per test 1 second memory limit per test 256 megabytes input standard input ...
- SHA-256 加密原理
网络中传输敏感信息的时候通常会对字符串做加密解密处理 SHA-256 加密原理
- eclipse中.project文件和.classpath文件详解
一.概述.project是项目文件,项目的结构都在其中定义,比如lib的位置,src的位置,classes的位置..classpath的位置定义了你这个项目在编译时所使用的$CLASSPATH. 二. ...