欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

Java反射:Class类,动态加载类获取方法和成员变量构造信息,方法反射的基本操作,集合泛型的本质

时间:2023-08-05

import java.lang.reflect.Method;

public class ClassUtil {

public static void printClassMethodMessage(Object obj){

//要获取类的信息 首先要获取类的类类型

Class c = obj.getClass();//传递的是哪个子类的对象 c就是该子类的类类型

//获取类的名称

System.out.println("类的名称是:"+c.getName());

Method[] ms = c.getMethods();//c.getDeclaredMethods()

for(int i = 0; i < ms.length;i++){

//得到方法的返回值类型的类类型

Class returnType = ms[i].getReturnType();

System.out.print(returnType.getName()+" ");

//得到方法的名称

System.out.print(ms[i].getName()+"(");

//获取参数类型--->得到的是参数列表的类型的类类型

Class[] paramTypes = ms[i].getParameterTypes();

for (Class class1 : paramTypes) {

System.out.print(class1.getName()+",");

}

System.out.println(")");

}

}

public static void printFieldMessage(Object obj) {

Class c = obj.getClass();

//Field[] fs = c.getFields();

Field[] fs = c.getDeclaredFields();

for (Field field : fs) {

//得到成员变量的类型的类类型

Class fieldType = field.getType();

String typeName = fieldType.getName();

//得到成员变量的名称

String fieldName = field.getName();

System.out.println(typeName+" "+fieldName);

}

}

public static void printConMessage(Object obj){

Class c = obj.getClass();

//Constructor[] cs = c.getConstructors();

Constructor[] cs = c.getDeclaredConstructors();

for (Constructor constructor : cs) {

System.out.print(constructor.getName()+"(");

//获取构造函数的参数列表--->得到的是参数列表的类类型

Class[] paramTypes = constructor.getParameterTypes();

for (Class class1 : paramTypes) {

System.out.print(class1.getName()+",");

}

System.out.println(")");

}

}

}

MethodDemo:

===========

MethodDemo1.java


import java.lang.reflect.Method;

public class MethodDemo1 {

public static void main(String[] args) {

//要获取print(int ,int )方法 1.要获取一个方法就是获取类的信息,获取类的信息首先要获取类的类类型

A a1 = new A();

Class c = a1.getClass();

try {

//Method m = c.getMethod("print", new Class[]{int.class,int.class});

Method m = c.getMethod("print", int.class,int.class);

//方法的反射操作

//a1.print(10, 20);方法的反射操作是用m对象来进行方法调用 和a1.print调用的效果完全相同

//方法如果没有返回值返回null,有返回值返回具体的返回值

//Object o = m.invoke(a1,new Object[]{10,20});

Object o = m.invoke(a1, 10,20);

System.out.println("==================");

//获取方法print(String,String)

Method m1 = c.getMethod("print",String.class,String.class);

//用方法进行反射操作

//a1.print("hello", "WORLD");

o = m1.invoke(a1, "hello","WORLD");

System.out.println("===================");

// Method m2 = c.getMethod("print", new Class[]{});

Method m2 = c.getMethod("print");

// m2.invoke(a1, new Object[]{});

m2.invoke(a1);

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

class A{

public void print(){

System.out.println("helloworld");

}

public void print(int a,int b){

System.out.println(a+b);

}

public void print(String a,String b){

System.out.println(a.toUpperCase()+","+b.toLowerCase());

}

}

MethodDemo2.java


import java.io.BufferedReader;

import java.io.InputStreamReader;

import java.lang.reflect.Method;

public class MethodDemo2 {

public static void main(String[] args) {

UserService us = new UserService();

try {

BufferedReader br = new BufferedReader(

new InputStreamReader(System.in));

System.out.println("请输入命令:");

String action = br.readLine();

Class c = us.getClass();

Method m = c.getMethod(action);

m.invoke(us);

} catch (Exception e) {

e.printStackTrace();

}

}

}

MethodDemo3.java


public class MethodDemo3 {

public static void main(String[] args) {

// TODO Auto-generated method stub

User u1 = new User("zhangsan", "123456", 30);

System.out.println(BeanUtil.getValueByPropertyName(u1, "username"));

System.out.println(BeanUtil.getValueByPropertyName(u1, "userpass"));

}

}

MethodDemo4.java


import java.lang.reflect.Method;

import java.util.ArrayList;

public class MethodDemo4 {

public static void main(String[] args) {

ArrayList list = new ArrayList();

ArrayList list1 = new ArrayList();

list1.add("hello");

//list1.add(20);错误的

Class c1 = list.getClass();

Class c2 = list1.getClass();

System.out.println(c1 == c2);

//反射的操作都是编译之后的操作

try {

Method m = c2.getMethod("add", Object.class);

m.invoke(list1, 20);//绕过编译操作就绕过了泛型

System.out.println(list1.size());

System.out.println(list1);

//现在不能这样遍历

} catch (Exception e) {

e.printStackTrace();

}

}

}

JavaBean:

=========

User.java


//标准的JavaBean类有私有属性都对应有get/set方法,有无参数的构造方法

public class User {

private String username;

private String userpass;

private int age;

如果你进阶的路上缺乏方向,可以点击我的【Github】加入我们的圈子和安卓开发者们一起学习交流!
以下全部内容都可以在GitHub中获取!

Android进阶学习全套手册

Android对标阿里P7学习视频

BATJ大厂Android高频面试题

最后,借用我最喜欢的乔布斯语录,作为本文的结尾:

人这一辈子没法做太多的事情,所以每一件都要做得精彩绝伦。
你的时间有限,所以不要为别人而活。不要被教条所限,不要活在别人的观念里。不要让别人的意见左右自己内心的声音。
最重要的是,勇敢的去追随自己的心灵和直觉,只有自己的心灵和直觉才知道你自己的真实想法,其他一切都是次要。

4%BC%9A%E8%BF%99%E4%BA%9B%EF%BC%9F%E5%A6%82%E4%BD%95%E9%9D%A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md)加入我们的圈子和安卓开发者们一起学习交流!**
以下全部内容都可以在GitHub中获取!

Android进阶学习全套手册

[外链图片转存中…(img-nQRSjfkA-1643958773371)]

Android对标阿里P7学习视频

[外链图片转存中…(img-i4WJfpJ7-1643958773372)]

BATJ大厂Android高频面试题

[外链图片转存中…(img-QKEIn8w6-1643958773372)]

最后,借用我最喜欢的乔布斯语录,作为本文的结尾:

人这一辈子没法做太多的事情,所以每一件都要做得精彩绝伦。
你的时间有限,所以不要为别人而活。不要被教条所限,不要活在别人的观念里。不要让别人的意见左右自己内心的声音。
最重要的是,勇敢的去追随自己的心灵和直觉,只有自己的心灵和直觉才知道你自己的真实想法,其他一切都是次要。

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。