困扰多年的getDeclaredField反射失败,打印的是:方法

困扰多年的反射问题,要什么姿势才能正常反射呢?

相关帖子:

http://www.jfinal.com/feedback/4622

http://www.jfinal.com/feedback/409

难道我要重新写对应的get、set方法?应该不是吧!~

很难取舍啊,是这里问题吗?测试过:和这个无关系,没get、set的方法,怎么反射呢?

// 设置是否生成链式 setter 方法,强烈建议配置成 false,否则 fastjson 反序列化会跳过有返回值的 setter 方法
		generator.setGenerateChainSetter(false);

打印field出来的是:

public static final com.analysis.model.Company com.analysis.model.Company.dao

调用的方法:

	public static <T> boolean outPutExcel(List<T> list, String[] hdNames, String[] hds, String xlsName,
			HttpServletRequest request, HttpServletResponse response) throws Exception {

		Workbook wb = new HSSFWorkbook(); // 创建工作薄

		Sheet sheet = wb.createSheet(); // 创建工作表
		sheet.autoSizeColumn((short) 0); // 自适应宽度
		// 写入表头---Excel的第一行数据
		Row nRow = sheet.createRow(0); // 创建行
		for (int i = 0; i < hdNames.length; i++) {
			CellStyle style = wb.createCellStyle();
			// 设置字体和文字大小
			Font font2 = wb.createFont();
			font2.setFontName("仿宋_GB2312");
			//font2.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 粗体显示
			font2.setBold(true);
			font2.setFontHeightInPoints((short) 12);
			// font2.setColor(HSSFColor.RED.index);// 字体颜色:红色
			//font2.setColor(HSSFColor.BLACK.index);// 字体颜色:黑色
			style.setFont(font2);// 选择需要用到的字体格式
			
			Cell nCell = nRow.createCell(i); // 创建单元格
			nCell.setCellValue(hdNames[i]);
			nCell.setCellStyle(style);
		}

		// 写入每一行数据---一条记录就是一行数据
		for (int i = 0; i < list.size(); i++) {
			for (int j = 0; j < hds.length; j++) {
				//logger.info("list.get(i):" + list.get(i) + "  hds[j]: " + hds[j]);
				Object o = getFieldValue(list.get(i), hds[j]); // 得到列的值
				data2Excel(sheet, o, i + 1, j); // 将值写入Excel
			}
		}
		return downloadExcel(wb, xlsName, request, response);
	}
	private static <T> Object getFieldValue(T t, String fieldName) throws Exception {
		if (t == null) {
			return null;
		}
		Field[] s =  t.getClass().getDeclaredFields();
		logger.info("s: " + s);
		for (Field field : s) {
			logger.info("field: " + field);
		}
		//logger.info("反射t.getClass(): " + clazz.getClass().getDeclaredField(fieldName));
		Field field = t.getClass().getDeclaredField(fieldName);
		field.setAccessible(true);//暴力反射
		Object o = field.get(t);//得到字段数据的值
		return o;
	}


Generator生成的model:

package com.analysis.model.base;

import com.jfinal.plugin.activerecord.Model;
import com.jfinal.plugin.activerecord.IBean;

/**
 * Generated by JFinal, do not modify this file.
 */
@SuppressWarnings("serial")
public abstract class BaseCompany<M extends BaseCompany<M>> extends Model<M> implements IBean {

	public void setId(java.lang.Integer id) {
		set("id", id);
	}
	
	public java.lang.Integer getId() {
		return getInt("id");
	}
	
	public void setCompanyname(java.lang.String companyname) {
		set("companyname", companyname);
	}
	
	public java.lang.String getCompanyname() {
		return getStr("companyname");
	}
	
	public void setTshortname(java.lang.String tshortname) {
		set("tshortname", tshortname);
	}
	
	public java.lang.String getTshortname() {
		return getStr("tshortname");
	}
	
	public void setManager(java.lang.String manager) {
		set("manager", manager);
	}
	
	public java.lang.String getManager() {
		return getStr("manager");
	}
	
	public void setProvince(java.lang.String province) {
		set("province", province);
	}
	
	public java.lang.String getProvince() {
		return getStr("province");
	}
	
	public void setCity(java.lang.String city) {
		set("city", city);
	}
	
	public java.lang.String getCity() {
		return getStr("city");
	}
	
	public void setCountry(java.lang.String country) {
		set("country", country);
	}
	
	public java.lang.String getCountry() {
		return getStr("country");
	}
	
	public void setLongitude(java.lang.Double longitude) {
		set("longitude", longitude);
	}
	
	public java.lang.Double getLongitude() {
		return getDouble("longitude");
	}
	
	public void setLatitude(java.lang.Double latitude) {
		set("latitude", latitude);
	}
	
	public java.lang.Double getLatitude() {
		return getDouble("latitude");
	}
	
	public void setArea(java.lang.Integer area) {
		set("area", area);
	}
	
	public java.lang.Integer getArea() {
		return getInt("area");
	}
	
	public void setIsJoint(java.lang.Integer isJoint) {
		set("isJoint", isJoint);
	}
	
	public java.lang.Integer getIsJoint() {
		return getInt("isJoint");
	}
	
	public void setCitylevel(java.lang.Double citylevel) {
		set("citylevel", citylevel);
	}
	
	public java.lang.Double getCitylevel() {
		return getDouble("citylevel");
	}
	
	public void setCompanyType(java.lang.Integer companyType) {
		set("companyType", companyType);
	}
	
	public java.lang.Integer getCompanyType() {
		return getInt("companyType");
	}
	
	public void setCreated(java.util.Date created) {
		set("created", created);
	}
	
	public java.util.Date getCreated() {
		return get("created");
	}
	
	public void setUpdated(java.util.Date updated) {
		set("updated", updated);
	}
	
	public java.util.Date getUpdated() {
		return get("updated");
	}
	
}
package com.analysis.model;

import com.analysis.model.base.BaseCompany;

/**
 * Generated by JFinal.
 */
@SuppressWarnings("serial")
public class Company extends BaseCompany<Company> {
	public static final Company dao = new Company().dao();
}
400595 [XNIO-11 task-1] INFO  com.tool.ExcelKit  [   ] – s: [Ljava.lang.reflect.Field;@42b588
400596 [XNIO-11 task-1] INFO  com.tool.ExcelKit  [   ] – field: public static final com.analysis.model.Company com.analysis.model.Company.dao
java.lang.NoSuchFieldException: id
	at java.base/java.lang.Class.getDeclaredField(Class.java:2489)
	at com.tool.ExcelKit.getFieldValue(ExcelKit.java:359)
	at com.tool.ExcelKit.outPutExcel(ExcelKit.java:299)
	at com.analysis.company.CompanyController.dowmInExcel(CompanyController.java:340)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:564)
	at com.jfinal.aop.Invocation.invoke(Invocation.java:97)
	at com.analysis.admin.auth.AdminAuthInterceptor.intercept(AdminAuthInterceptor.java:50)
	at com.jfinal.aop.Invocation.invoke(Invocation.java:91)
	at com.analysis.login.LoginSessionInterceptor.intercept(LoginSessionInterceptor.java:53)
	at com.jfinal.aop.Invocation.invoke(Invocation.java:91)
	at com.jfinal.core.ActionHandler.handle(ActionHandler.java:86)
	at com.jfinal.core.JFinalFilter.doFilter(JFinalFilter.java:90)
	at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
	at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
	at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)
	at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
	at io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)
	at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
	at io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)
	at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:132)
	at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
	at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
	at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)
	at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)
	at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)
	at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)
	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
	at io.undertow.servlet.handlers.SessionRestoringHandler.handleRequest(SessionRestoringHandler.java:119)
	at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:269)
	at io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:78)
	at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:133)
	at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:130)
	at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)
	at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
	at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:249)
	at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:78)
	at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:99)
	at io.undertow.server.Connectors.executeRootHandler(Connectors.java:376)
	at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:830)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
	at java.base/java.lang.Thread.run(Thread.java:832)


评论区

杜福忠

2020-11-22 01:18

回想了一下,Field确实不行,应该用Method才对,
getFieldValue方法改成getMethodValue (...){
return t.getClass().getMethod("get", String.class).invoke(t, fieldName);}

杜福忠

2020-11-22 01:24

感觉不如改成:
Object o = ((Model)t).get(fieldName);来得方便

fmpoffice

2020-11-24 10:21

@杜福忠 Object o = ((Model)t).get(fieldName); 这个可以,感谢老哥,完美解决