首页 > 编程语言 >java EE开发之Servlet第十课:反射基础二

java EE开发之Servlet第十课:反射基础二

时间:2023-04-20 14:57:19浏览次数:51  
标签:java String EE System 第十课 Student println public out

 

##一.反射类中的属性
在Java中一切皆对象,那么类中任何一个属性都可以看做一个对象,一 个属性对应一个Field对象

####1.先建一个普通的类,写上不同修饰类型的属性

public class Student {
public String name;
protected int age;
String sex;
private double money;
public static String phone;
public static final String email = "[email protected]";
public Date brithday;

public Student() {
this.name = "tom";
System.out.println("无参构造方法调用...");
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public Student(String name) {
this.name = name;
System.out.println("一参构造方法调用...");
}
private Student(double money) {
this.money = money;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getSex() {
return sex;
}

public void setSex(String sex) {
this.sex = sex;
}
public double getMoney() {
return money;
}
public void setMoney(double money) {
this.money = money;
}
public static String getPhone() {
return phone;
}
public static void setPhone(String phone) {
Student.phone = phone;
}
public Date getBrithday() {
return brithday;
}
public void setBrithday(Date brithday) {
this.brithday = brithday;
}
public static String getEmail() {
return email;
}
private void sleep() {
System.out.println("睡啊睡...");
}
public void a(int a, int b) {

}
}

####2,反射加载类并实例化

Class c = Class.forName("com.accp.entity.Student");
Student stu = (Student)c.newInstance();
####3,获取指定名称的公有属性

Field f1 = c.getField("name");
System.out.println(f1);

stu.name = "james";
/*通过反射的方式,给属性赋值*/
f1.set(stu, "james");
/* 通过属性对象,调用get()方法,参数是stu对象
通过属性对象,调用get()方法,参数是stu对象*/
System.out.println(f1.get(stu));

####4,获取公有(静态)属性


Field ff = c.getField("phone");

stu.name = "138888";
ff.set(stu, "138888");
/*反射获取属性值*/
System.out.println(ff.get(stu));


5,获取指定名称的非公有属性

Field f2 = c.getDeclaredField("money");
/*解锁*/
f2.setAccessible(true);
f2.set(stu, 8888.8);//赋值
System.out.println(f2.get(stu));//取值


####6,获取指定类的所有公有属性

Field [] fields = c.getFields();
for(Field ff:fields){
System.out.println(ff);
}


####7,获取指定类的所有公有属性


Field [] fields = c.getFields();
System.out.println("访问修饰符\t属性类型\t属性的名字");
for(Field ff:fields){
/*操作属性对象,获取其中每一部分*/
/*获取访问修饰符*/
System.out.println(soEasy(ff.getModifiers())+"\t"+
ff.getType().getSimpleName()+"\t"+
ff.getName());
}
/*自定义将返回的访问修饰符int类型转换为String类型 */
public static String soEasy(int modifier){
return Modifier.toString(modifier);
}

####8,获取所有的属性

Field [] fields = c.getDeclaredFields();
for(Field ff:fields){
//System.out.println(ff);
System.out.println(soEasy(ff.getModifiers())+"\t"+
ff.getType().getSimpleName()+"\t"+
ff.getName());
}


##二.反射类中的方法

在Java中一切皆对象,那么类中任何一个方法都可以看做一个对象,一个方法对应一个Method对象
加载类并初始化

Class c = Class.forName("com.accp.entity.Student");
/*反射创建Student 对象*/
Student stu = (Student)c.newInstance();


1,获了指定名称的公有方法


Method m1 = c.getMethod("setName", String.class);
m1.invoke(stu, "小牛");//调用setName()方法,其实就是赋值

Method m2 = c.getMethod("getName");
System.out.println(m2.invoke(stu));//调用m2:getName()方法


2,获取指定名称的非公有方法


Method m3 = c.getDeclaredMethod("sleep");
m3.setAccessible(true);//解锁
m3.invoke(stu);


3,获取全部的公有方法(包括父亲的);


Method [] ms1 = c.getMethods();
for(Method mm:ms1){
//System.out.println(mm);
System.out.println(soEasy(mm.getModifiers())+"\t"+
mm.getReturnType().getSimpleName()+"\t"+
parse(mm.getParameterTypes()));
}

 

4,获取自己声明方法(公有、私有),就没有获取父亲的方法


Method [] ms1 = c.getMethods();
for(Method mm:ms1){
//System.out.println(mm);
System.out.println(soEasy(mm.getModifiers())+"\t"+
mm.getReturnType().getSimpleName()+"\t"+
parse(mm.getParameterTypes()));
}
/*自定义实现将Class类型的参数数组转换成String类型*/
public static String parse(Class [] cs){
StringBuffer sb = new StringBuffer();
sb.append("(");
for(int i=0;i<cs.length;i++){
//获取class对象对应的名字,如:String.class-->String
sb.append(cs[i].getSimpleName());
//多个参数中间加一个逗号
//条件是最后一个参数后面不加逗号
if(i<cs.length-1){
sb.append(",");
}
}
sb.append(")");
return sb.toString();
}


##三,反射类中的构造方法

所有的java文件都会编译成一个class文件,与Clas类型的对象相对应在这个Class类型的对象中,包含了这个java类的属性、方法、构造方法等所有的东西。通过Class类型的对象,获取其构造方法(Constructor):可以通过构造来new出对象.


1,获取反射类无参数构造方法


/*通过Student模板对象,创建出一个实例。
就是去动态的调用其无参构造方法*/

Class c = Class.forName("com.accp.entity.Student");
Student stu1 = (Student)c.newInstance();
System.out.println(stu1.getName());

Constructor ct1 = c.getConstructor();
Student stu1 = (Student)ct1.newInstance();
System.out.println(stu1.getName());

2,获取反射类一参数的构造方法


Constructor ct2 = c.getConstructor(String.class);
Student stu2 = (Student)ct2.newInstance("jack");
System.out.println(stu2.getName());

 

3,获取反射类两参数的构造方法

Constructor ct3 = c.getConstructor(String.class,int.class);
Student stu3 = (Student)ct3.newInstance("marry",23);
System.out.println(stu3.getName());
System.out.println(stu3.getAge());

注意:以上的获取构造方法的前提是公有的

4,获取非公有的构造方法时,需要获取是自己声明的。


Constructor ct4 = c.getDeclaredConstructor(double.class);
//授权(解锁)
ct4.setAccessible(true);//默认是为false
Student stu4 = (Student)ct4.newInstance(2345.6);
System.out.println(stu4.getMoney());

 

5,获取所有的公有的构造方法的对象


Constructor [] cts1 = c.getConstructors();
for(Constructor cc:cts1){
System.out.println(cc);
}
System.out.println("==========================");

6,获取所有的构造方法的对象(包括私有的)


Constructor [] cts2 = c.getDeclaredConstructors();
for(Constructor cc:cts2){
System.out.println(cc);
}


补充: java中的可变参数

定义包含可变参数的方法

public static void test(int ... a){
int sum = 0;
for(int i=0;i<a.length;i++){
sum += a[i];
}
System.out.println(sum);
}


测试


public static void main(String[] args){
test();
test(1);
test(1,2);
test(1,2,3);
}

标签:java,String,EE,System,第十课,Student,println,public,out
From: https://www.cnblogs.com/xmxit/p/17336841.html

相关文章

  • opengauss Need repair修复
     问题描述:opengauss集群在做切换的时候,或者增删节点的时候,很容易发生节点repair,找不到主库的情况,这种情况需要把主库使用primary角色启动,然后build重建从库,就可以恢复集群 1.集群状态[omm@db01~]$gs_om-tstatus--detail[CMServerState]node......
  • java 增删改查接口命名规范(service与mapper)
    阿里推荐命名规范:转载自:https://www.cnblogs.com/zengzy698/p/15939088.html......
  • LeetCode Top100:回文链表 (python)
    LeetCodeTop100:回文链表给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。示例1:输入:head=[1,2,2,1]输出:true示例2:输入:head=[1,2]输出:false提示:链表中节点数目在范围[1,105] 内0<=Node.val<=9 ......
  • JavaScript函数基础语法
    ●我们代码里面所说的函数和我们上学的时候学习的什么三角函数、二次函数之类的不是一个东西函数的概念●对于js来说,函数就是把任意一段代码放在一个盒子里面●在我想要让这段代码执行的时候,直接执行这个盒子里面的代码就行●先看一段代码//这个是我们以前写的一段代码for......
  • 在JAVA中怎么比较Double类型数据的大小?
    评:doublea=0.001;doubleb=0.0011;BigDecimaldata1=newBigDecimal(a);BigDecimaldata2=newBigDecimal(b);data1.compareTo(data2)非整型数,运算由于精度问题,可能会有误差,建议使用BigDecimal类型!publicintcompareTo(BigDecimalval)将此BigDecimal......
  • java守护进程
    评:1.所谓守护线程就是运行在程序后台的线程,程序的主线程Main(比方java程序一开始启动时创建的那个线程)不会是守护线程.2.Daemonthread在Java里面的定义是,如果虚拟机中只有Daemonthread在运行,则虚拟机退出。虚拟机中可能会同时有很多个线程在运行,只有当所有的非守护线程都......
  • java线程同步和异步的区别
    在Java中,同步和异步是指多线程并发执行中的两种不同的机制。同步指的是线程之间的协作方式,即当一个线程在执行一个任务时,其他线程必须等待该线程执行完该任务后才能执行同一段代码。同步机制通常使用synchronized关键字或Lock对象进行实现,以保证多线程共享的资源同步访问。 ......
  • Java多线程基础
    1、创建线程类的方法1.1、继承Thread类当一个类继承了Thread类,该类就可以当做线程使用我们会重写run方法,写上自己的业务代码run方法是Thread类实现了Runnable接口的run方法1.1.1、入门案例/***@authorCarl*@version1.0*/publicclassThread01{public......
  • java线程同步和异步的区别
    在Java中,同步和异步是指多线程并发执行中的两种不同的机制。同步指的是线程之间的协作方式,即当一个线程在执行一个任务时,其他线程必须等待该线程执行完该任务后才能执行同一段代码。同步机制通常使用synchronized关键字或Lock对象进行实现,以保证多线程共享的资源同步访问。异步指的......
  • java - 缩放新的图片
    /***缩放新的图片*/publicstaticStringscaleImg(StringwaterLogoPath,StringwaterLogoPathTmp,Stringsuffix,ImgWHwh){try{suffix=suffix.replace(".","");Filesrcfile=newFile(water......