Java基础反射-调用类
Student类
package com.test.wang;
import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList; import com.test.wang.student.Student;
public class fanshe {
public static void main(String[] args)throws Exception { //1.加载class对象
Class stuClass= Class.forName("com.test.wang.student.Student"); //2.获取class中的方法
//2.1.获取成员方法
//2.1.1.获取Student类中的 testStudent共有方法 一个参数 返回类型 无
Method m = stuClass.getMethod("testStudent", String.class);
//2.1.2.获取Student类中的 intStudent共有方法 一个参数 返回类型 String
Method intm = stuClass.getMethod("intStudent", String.class);
//2.1.3.获取Student类中的 liangStudent共有方法 二个参数 返回类型 String
Method liangm = stuClass.getDeclaredMethod("liangStudent", String.class,int.class);
//2.1.4.获取Student类中的 liangStudent私有方法 二个参数 返回类型 String
Method privatem = stuClass.getDeclaredMethod("privateStudent", String.class,int.class);
//2.2.获取构造方法
//2.2.1.获取共有的、无参数的构造方法
Constructor con = stuClass.getConstructor(null);
//2.2.2.获取构造方法并调用
Constructor dcon = stuClass.getDeclaredConstructor(String.class);
//2.3.获取字段信息
//2.3.1.获取共有字段并调用
Field publicFiled = stuClass.getField("name");
//2.3.2.获取字段并调用
Field privateFiled = stuClass.getDeclaredField("phoneNum");
//2.4.反射main方法
//2.4.1.main方法的反射
Method main = stuClass.getMethod("main", String[].class); //3.获取一个对象********等同于****Student obj = new Student();
System.out.println("\n******获取一个对象******");
Object obj = stuClass.getConstructor().newInstance(); //4.调用方法 有返回类型 在这里实际都是返回Object
System.out.println("\n******调用共有、无参数构造方法******");
m.invoke(obj,"wang"); String num =intm.invoke(obj,"wang").toString();
String stu = liangm.invoke(obj, "wang",23).toString(); privatem.setAccessible(true);//暴力访问(忽略掉访问修饰符)
String privateStu = privatem.invoke(obj, "wang",23).toString(); System.out.println("\n******无参数构造方法的调用******");
con.newInstance(); System.out.println("\n******默认的构造方法有参数******");
dcon.setAccessible(true);
dcon.newInstance("wang"); publicFiled.set(obj, "天宇"); privateFiled.setAccessible(true);
privateFiled.set(obj, "155*******5"); Student wangstu = (Student)obj; System.out.println("\n******main方法******");
main.invoke(null, (Object)new String[]{"a","b","c"}); //返回结果
System.out.println("\n******成员方法一个参数******");
System.out.println(num);
System.out.println("\n******成员方法二个参数******");
System.out.println(stu);
System.out.println("\n******私有成员方法二个参数******");
System.out.println(privateStu);
System.out.println("\n******获取共有字段信息******");
System.out.println("publicFiled:"+wangstu.name);
System.out.println("\n******获取字段信息、私有的字段信息需要用方法写出来******");
System.out.println("privateFiled:"+wangstu.toString()); /*
* 通过反射越过泛型检查
*/
ArrayList<String> strList = new ArrayList<String>();
strList.add("aaa");
strList.add("bbb");
//strList.add(100);
//获取ArrayList的class对象,反向调用add()方法,添加数据
Class ListClass = strList.getClass();
//获取add()方法
Method ListClassMethod = ListClass.getMethod("add", Object.class);
//调用add()方法
ListClassMethod.invoke(strList, 100);
//遍历集合
for(Object o : strList){
System.out.println(o);
} }
}
测试类
package com.test.wang.student; import java.text.SimpleDateFormat;
import java.util.Date; public class Student {
/*
* 构造方法
*/
Student(String stu){
System.out.println("默认的构造方法stu="+stu);
}
/*
* 无参数构造方法
*/
public Student(){
System.out.println("调用共有、无参数构造方法执行了。。。");
} public void testStudent(String name){
System.out.println("调用共有、一个参数方法执行了。。。姓名:"+name);
} public String intStudent(String name){
int num = name.length();
return "姓名:"+name+" 名字长度:"+num;
} public String liangStudent(String name,int age){
return "姓名:"+name+" 年龄:"+age;
} private String privateStudent(String name,int age){
return "姓名:"+name+" 年龄:"+age;
} public String name; private String phoneNum; /**
* @return the name
*/
public String getName() {
return name;
}
/**
* @return the phoneNum
*/
public String getPhoneNum() {
return phoneNum;
}
@Override
public String toString(){
return "Student [name:"+name+",phoneNum:"+phoneNum+"]";
}
public static void main(String[] args){
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
System.out.println("main方法执行了。。。");
System.out.println("当前时间是:"+df.format(new Date()));
}
}
控制台输出
******获取一个对象******
调用共有、无参数构造方法执行了。。。
******调用共有、无参数构造方法******
调用共有、一个参数方法执行了。。。姓名:wang
******无参数构造方法的调用******
调用共有、无参数构造方法执行了。。。
******默认的构造方法有参数******
默认的构造方法stu=wang
******main方法******
main方法执行了。。。
当前时间是:2018-07-31 15:12:18
******成员方法一个参数******
姓名:wang 名字长度:4
******成员方法二个参数******
姓名:wang 年龄:23
******私有成员方法二个参数******
姓名:wang 年龄:23
******获取共有字段信息******
publicFiled:天宇
******获取字段信息、私有的字段信息需要用方法写出来******
privateFiled:Student [name:天宇,phoneNum:155*******5]
aaa
bbb
100
Java基础反射-调用类的更多相关文章
- java利用反射调用类的某个方法
java利用反射机制 可以动态调用某个类的某个方法,在 扩展系统功能或提供对外接口时经常用的到. 代码如下: 打印类Print.java package com.test.reflct; /** * ...
- 利用java反射调用类的的私有方法--转
原文:http://blog.csdn.net/woshinia/article/details/11766567 1,今天和一位朋友谈到父类私有方法的调用问题,本来以为利用反射很轻松就可以实现,因为 ...
- Java基础-反射(reflect)技术详解
Java基础-反射(reflect)技术详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.类加载器 1>.JVM 类加载机制 如下图所示,JVM类加载机制分为五个部分 ...
- java利用反射获取类的属性及类型
java利用反射获取类的属性及类型. import java.lang.reflect.Field; import java.math.BigDecimal; import java.util.Map ...
- Java基础-DButils工具类(QueryRunner)详解
Java基础-DButils工具类(QueryRunner)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 如果只使用JDBC进行开发,我们会发现冗余代码过多,为了简化JDBC ...
- C#如何通过反射调用类下的方法
首先模拟一个mvc的项目,创建一个业务类(HomeService),在类下创建3个方法 public class HomeService { /// <summary> /// 无参方法 ...
- C# 利用反射调用类下的方法
namespace TestReflection { public partial class Form1 : Form { public Form1() { InitializeComponent( ...
- Java基础之File类的使用
Java基础之File类的使用 1.File类的构造方法和常用方法 2.对File中listFile(FileNameFilter name)学习 3.与File文件类相关的实现 File类的构造方法 ...
- C#通过反射调用类及方法
反射有个典型的应用,就是菜单的动态加载,原理就是通过反射调用某个窗体(类).下面演示一下通过反射调用类及方法: 1.新建一个类,命名为:ReflectionHelper,代码如下: #region 创 ...
随机推荐
- .net关于应用程序缓存的一些疑惑
疑惑:获取缓存后强制转换为实体对象传递给前台,如果前台对这个实体对象中属性更改的话缓存中的数据也随之改变,为啥??? 首先是创建缓存的方法: /// <summary> /// 创建缓存项 ...
- Eclipse/MyEclipse下如何Maven管理多个Mapreduce程序?(企业级水平)
不多说,直接上干货! 如何在Maven官网下载历史版本 Eclipse下Maven新建项目.自动打依赖jar包(包含普通项目和Web项目) Eclipse下Maven新建Web项目index.jsp报 ...
- Selenium并行启动多个浏览器
如果你对 Selenium 自动化测试已经非常熟悉,你仅仅需要一个快速上手来使程序运行起来.本章节的内容能满足不同的技术层次,但是如果你仅仅需要一个可以快速上手的指引,那么就显得有点多.如果是这样,你 ...
- Impala介绍
Impala介绍 Impala支持的文件格式 Impala可以对Hadoop中大多数格式的文件进行查询.它能通过create table和insert的方式将一部分格式的数据加载到table中,但值得 ...
- 使用python ftplib包递归下载文件夹及文件
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Date : 2018-06-11 09:35:49 # @Author : Yaheng Wang ...
- 《精通Spring4.X企业应用开发实战》读后感第六章(国际化)
- 13. CTF综合靶机渗透(六)
靶机说明 Breach1.0是一个难度为初级到中级的BooT2Root/CTF挑战. VM虚机配置有静态IP地址(192.168.110.140),需要将虚拟机网卡设置为host-only方式组网,并 ...
- 8. CTF综合靶机渗透(一)
靶机说明 虚拟机难度中等,使用ubuntu(32位),其他软件包有: PHP apache MySQL 目标 Boot to root:从Web应用程序进入虚拟机,并获得root权限. 运行环境 靶机 ...
- linux---安装ftp并配置用户部分权限
一.启动vsftpd服务1. 启动VSFTP服务器A:cenos下运行:yum install vsftpdB. 登录Linux主机后,运行命令:”service vsftpd start”C. 要让 ...
- Educational Codeforces Round 64 (Rated for Div. 2)D(并查集,图)
#include<bits/stdc++.h>using namespace std;int f[2][200007],s[2][200007];//并查集,相邻点int find_(in ...