有Student类,Person类,还有一个叫Class的类,这是反射的源头。
正常方式:通过完整的类名 > 通过new实例化 > 取得实例化对象
反射方式:实例化对象 > getClass()方法 > 通过完整的类名
 
需要使用反射就要获得Class这个类,有三种方法:
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 反射(简单捋一下)的更多相关文章

  1. Java反射-简单应用

    为了程序更好的维护和扩展,在面向对象思维的世界里,首先是面向接口编程,然后我们应该把做什么和怎么做进行分离. 以下我将用一个开晚会的样例来演示一下,终于达到的效果是:工厂+反射+配置文件实现程序的灵活 ...

  2. Java反射+简单工厂模式总结

    除了 new 之外的创建对象的方法 通过 new 创建对象,会使得程序面向实现编程,先举个例子,某个果园里现在有两种水果,一种是苹果,一种是香蕉,有客户想采摘园子里的水果,要求用get()方法表示即可 ...

  3. Java反射 - 简单的给Bean赋值和取值

    由于项目的实际需要,所以利用java反射原理写了一个简单给bean赋值和取值通用的类,在此记录下方便自己日后用到,也为需要的兄弟提供个参考例子. 工具类BeanRefUtil:   package c ...

  4. Java反射简单使用--第一次细致阅读底层代码

    1:所写的东西都经过验证,保证正确,环境jdk8,eclipse2:在例子中,尽量以生产环境中实际代码为例,那种固定值什么的没什么意义 问题: 1:想获取调用方法所需要的参数 2:参数是以json形式 ...

  5. java反射简单实例

    这篇博友的总结的反射知识点是比较全面的 http://www.cnblogs.com/rollenholt/archive/2011/09/02/2163758.html 下面介绍我用反射做的两个功能 ...

  6. java反射机制简单实例

    目录 Java反射 简单实例 @(目录) Java反射 Java语言允许通过程序化的方式间接对Class进行操作.Class文件由类装载器装载后,在JVM中将形成一份描述Class结构的元信息对象,通 ...

  7. java反射机制的简单介绍

    参考博客: https://blog.csdn.net/mlc1218559742/article/details/52754310 先给出反射机制中常用的几个方法: Class.forName (& ...

  8. java反射并不是什么高深技术,面向对象语言都有这个功能,而且功能也很简单,就是利用jvm动态加载时生成的class对象

    java反射并不是什么高深技术,面向对象语言都有这个功能. 面向对象语言都有这个功能,而且功能也很简单,就是利用jvm动态加载时生成的class对象,去获取类相关的信息 2.利用java反射可以调用类 ...

  9. Java反射(六)纯面向接口编程的简单框架实践

    我们知道在使用MyBatis开发时,只需要添加DAO接口和对应的映射XML文件,不需要写DAO的实现类,其实底层是通过动态代理实现. 本文将使用前几篇文章的知识点实现一个纯面向接口编程的简单框架,与M ...

随机推荐

  1. php 输出缓存,每秒打印一个数字

    <?php set_time_limit(0); //以上三行不加上nginx下不执行,一次性显示出来 header('Content-Type: text/event-stream'); // ...

  2. bzoj 4044 Virus synthesis - 回文自动机 - 动态规划

    题目传送门 需要高级权限的传送门 题目大意 要求用两种操作拼出一个长度为$n$的只包含'A','T','G','C'的字符串 在当前字符串头或字符串结尾添加一个字符 将当前字符串复制,将复制的串翻转, ...

  3. Python中对象的引用与复制

    在python进行像b = a这样的赋值时,只会创建一个对a的新引用,使a的引用计数加1,而不会创建新的对象: >>> a = 'xyz' >>> import s ...

  4. topcoder srm 460 div1

    problem1 link 设$f[i][j]$表示已经分配了answers中的前$i$个,分配给的问题的状态为 $j$的方案数. 其中状态可以用$n$位的三进制表示,0表示还未分配,1表示已分配是 ...

  5. CentOS7下Docker中构建可以自动发布到项目的Tomcat容器

    步骤 下载镜像 搜索相应的镜像文件:docker search 'tomcat' 如下 下载镜像:docker pull tomcat:7,如下图 PS:后面的数字代表tomcat的版本,可以自己选择 ...

  6. Python3 tkinter基础 Label imag显示图片

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  7. 如何评价 React 实现的前端 UI 库 material-ui?

    作者:知乎用户链接:https://www.zhihu.com/question/51040975/answer/208582603来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请 ...

  8. linux内核发生Oops时怎么办?

    1. 定位发生Oops的代码 1.1 通过addr2line命令定位 aarch64-openwrt-linux-gnu-addr2line -e vmlinux ffff000008087f00 1 ...

  9. luogu P2713 罗马游戏

    思路 模拟就好 左偏树合并 并查集寻找 代码 #include <bits/stdc++.h> #define FOR(i,a,b) for(int i=a;i<=b;++i) us ...

  10. SpringBoot cookie工具类

    code: import java.io.IOException; import java.util.HashMap; import java.util.Map; import javax.annot ...