Java之反射代码演示说明
还不存在的类–即我们需要使用反射来使用的类
Person类:
package com.qf.demo4;
public class Person {
private String name;
public int age;
static int weight;
int male;
protected int num;
public Person(String name, int age, int weight) {
this.name = name;
this.age = age;
this.weight = weight;
System.out.println("有参数的构造方法");
}
public Person() {
System.out.println("无参数的构造方法");
}
public void eat() {
System.out.println("吃");
}
public void drink(String type) {
System.out.println("喝" + type);
}
public String sleep() {
System.out.println("睡");
return "呵呵";
}
private void play() {
System.out.println("玩");
}
public static void hehe() {
System.out.println("heheheheh");
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ",weight = "+weight+"]";
}
}
演示代码:
Test1:创建Class对象
package com.qf.demo4;
import com.qf.demo.Person;
/**
* 每一个类只有一个class 对象
* com.qf.demo.Person 包名+类名 全限定名
* @author Administrator
*
*/
public class Test {
public static void main(String[] args) {
// 创建Class 对象
// 第一种方式:类.class
Class class1 = Person.class;
System.out.println(class1.hashCode());
// 第二种方式:创建类的对象;然后--对象.getClass()
Person person = new Person();
Class class2 = person.getClass();
System.out.println(class2.hashCode());
// 第三种方式:使用forname方法,参数为相对于本工程的地址
try {
Class class3 = Class.forName("com.qf.demo.Person");
System.out.println(class3.hashCode());
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Test2:创建Constructor对象,并创建Person类(还没有的类)对象
package com.qf.demo4;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
public class Test2 {
public static void main(String[] args) {
try {
Class class1 = Class.forName("com.qf.demo4.Person");
Constructor[] constructors = class1.getConstructors();
for (Constructor constructor : constructors) {
System.out.println(constructor);
}
// 1 通过构造方法创建 Perosn对象
Constructor constructor = class1.getConstructor(null);// 得到无参的构造方法
Person person = (Person) constructor.newInstance(null);
System.out.println(person);
// 2 利用有参数的构造方法创建对象
Constructor constructor2 = class1.getConstructor(String.class,int.class,int.class);
Person person2 = (Person) constructor2.newInstance("张三",5,9);
System.out.println(person2);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Test3:获取方法,以及调用方法
package com.qf.demo4;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class Test3 {
public static void main(String[] args) {
try {
Class class1 = Class.forName("com.qf.demo4.Person");
// 得到构造方法
Constructor constructor = class1.getConstructor(null);
Object object = constructor.newInstance(null);
Method[] methods = class1.getMethods();// 得到本类和父类的非私有的方法
Method[] methods2 = class1.getDeclaredMethods();// 得到本类中声明的所有的方法(包括私有)
// 得到 无参 无返回值的 方法并且调用
Method method = class1.getMethod("eat", null);
// 调用方法的对象 实际参数
method.invoke(object, null);// 是哪个方法被调用
// 调用 有参数 无返回值的方法
Method method2 = class1.getMethod("drink", String.class);
method2.invoke(object, "水");
// 有返回值的
Method method3 = class1.getMethod("sleep", null);
Object object2 = method3.invoke(object, null);// invoke方法的返回值就是调用的方法的返回值
System.out.println(object2);
// 得到静态的方法
Method method4 = class1.getMethod("hehe", null);
method4.invoke(null, null);// 静态方法不需要传递对象 直接写null
// 私有的 私有的方法 必须用 getDeclaredMethod 才能得到
Method method5 = class1.getDeclaredMethod("play", null);
method5.setAccessible(true);// 私有方法默认没有权限调用,必须单独设定调用权限
method5.invoke(object, null);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
反射定义:http://blog.csdn.net/baidu_37107022/article/details/71234940
Java之反射代码演示说明的更多相关文章
- 如何利用缓存机制实现JAVA类反射性能提升30倍
一次性能提高30倍的JAVA类反射性能优化实践 文章来源:宜信技术学院 & 宜信支付结算团队技术分享第4期-支付结算部支付研发团队高级工程师陶红<JAVA类反射技术&优化> ...
- java 覆盖hashCode()深入探讨 代码演示样例
java 翻盖hashCode()深入探讨 代码演示样例 package org.rui.collection2.hashcode; /** * 覆盖hashcode * 设计HashCode时最重要 ...
- java 状态模式 解说演示样例代码
package org.rui.pattern; import junit.framework.*; /** * 为了使同一个方法调用能够产生不同的行为,State 模式在代理(surrogate)的 ...
- java注意事项演示 地图产生表 演示样本 来自thinking in java 4 20代码的章
java注意事项演示 地图产生表 演示样本 来自thinking in java 4 20代码的章 thinking in java 4免费下载:http://download.csdn.net/d ...
- DotNet,PHP,Java的数据库连接代码大全(带演示代码)
C#数据库连接字符串 Web.config文件 <connectionStrings> <!--SQLServer数据库连接--> <add name="con ...
- Java用代码演示String类中的以下方法的用法
用代码演示String类中的以下方法的用法 (1)boolean isEmpty(): 判断字符串是不是空串,如果是空的就返回true (2)char charAt(int index): 返回索引上 ...
- Java高新技术 反射机制
Java高新技术 反射机制 知识概要: (1)反射的基石 (2)反射 (3)Constructor类 (4)Field类 (5)Method类 (6)用反射方 ...
- Java基础-反射(reflect)技术详解
Java基础-反射(reflect)技术详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.类加载器 1>.JVM 类加载机制 如下图所示,JVM类加载机制分为五个部分 ...
- Java之反射(部分文档摘过来方便以后查看)
第1章 类加载器 1.1 类的加载 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化. l 加载 就是指将class文件读入内存,并为之创建 ...
随机推荐
- C++ struct 初始化的问题
struct student { int age; string name; int id; }; 初始化: student st1={10, "li ming", 01}; 修改 ...
- elasticsearch系列(一) 术语
elasticsearch(以下简称es)是一款开源的搜索引擎,基于apach lucene.最近在做nlp的时候顺便研究一下. 下面是官方列举的术语解释 Near Realtime 接近实时的查询, ...
- [转]Installing Memcached on Windows
Installing Memcached on Windows 原文链接https://commaster.net/content/installing-memcached-windows Sub ...
- Springmvc的工作流程
1.向服务器发送http请求,请求被前端控制器DispatcherServlet捕获. 2.DispatcherServlet根据servlet.xml中的配置进行URL解析后,得到(URL),然后根 ...
- PHP 手册
http://www.php.net/manual/zh/index.php 感谢中文翻译工作者. PHP 手册¶ by:Mehdi Achour Friedhelm Betz Antony Dovg ...
- ajax从新浪获取实时股票数据
最近在给公司做一个报表展示,然后领导要求上面加上一些股票的实时数据展示. 一开始同事给我一个聚合数据的网址,说从这上面可以获取到.我一看,哟呵,API接口什么的都提供好了,确实方便.然后想用的时候才发 ...
- log4j的Appenders配置
因为是刚开始使用log4j,很多配置方面的东西都不懂,记录下. 下面是我用STS(Spring Tool Suite)新建Spring MVC项目的时候,帮我自动生成的一个log4j.xml配置文件. ...
- 蓝桥杯-趣味算式-java
/* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: ...
- PHP怎么打开或者关闭文件?
什么是文件处理? 文件处理包括读取,关闭,重写等.掌握文件的处理需要读者理清思路,掌握好文件处理的关键步骤和常用函数,那么就可以运用自如了!感兴趣的请移步php文件处理专题. 比如,访问一个文件需要 ...
- 01背包Bone Collector
好几天没写博客了,整天忙着打比赛,希望能有参加省赛的资格,不容易啊. 今天复习背包,之前集训讲过,现在又忘了,昨天杭电校赛刚好有一题背包,居然不会做了,好尴尬,重新复习一下. https://vjud ...